一、grant语句实践

1、授权的核心特性与安全原则

授权是网络和服务器安全的基础,其核心在于精准控制权限范围,避免过度开放导致风险。主要特性及安全实践如下:

1.1权限最小化

核心原则:仅授予完成任务必需的权限,而非 “全权限”。

实践:

​ 数据库授权时,避免使用 all privileges(所有权限),而是指定具体操作。

​ 对数据库和表的授权,避免用 *(所有库 / 表),而是明确指定具体库和表。

1.2主机范围严格限制

核心原则:缩小允许访问的主机范围,减少暴露面。

实践:

​ 避免使用 %(表示所有 IP 均可访问),优先限制为局域网网段或单个 IP。

​ 若必须允许公网访问(需用 %),需配合防火墙规则、修改默认端口等额外措施。

2、服务器安全的核心理念与实践

服务器安全的核心是减少攻击入口、提升认证门槛,重点针对远程登录和服务暴露风险。

2.1. 远程登录安全(以 SSH 为例)

  • 禁止直接 root 登录:root 为最高权限账号,一旦泄露危害极大,应仅允许普通用户登录,必要时通过 susudo 提升权限。
  • 禁用账号密码登录:密码易被暴力破解,改用公私钥认证:
    • 生成公钥(客户端)和私钥(服务器),仅通过密钥匹配允许登录,杜绝密码传输风险。
  • 修改默认端口:SSH 默认端口 22 是黑客扫描的重点,建议改为 10000-65535 之间的非知名端口,减少扫描攻击。

2.2 通用服务安全

  • 修改默认端口:数据库、中间件等默认端口易被针对性攻击,需改为自定义端口。
  • 强密码策略:对于必须保留的密码,需设置复杂密码,避免简单密码。

grant语句可以直接创建,且赋值权限,给—个用户

#语法
grant select,insert,update,delete on 数据库 .数据表  to 用户名 @'%' identified by '密码 ';

# 创建用户且授权,查看用户
mysql> grant  select,insert,update,delete on kings.tanks to 'zhangm'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,password from mysql.user;
+--------+-----------+-------------------------------------------+
| user   | host      | password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root   | 127.0.0.1 |                                           |
| root   | ::1       |                                           |
| zhangm | %         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+--------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)

mysql>

刷新权限,修改了user表,创建,修改用户后,立即刷新权限

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>

二、远程连接MySQL

1、PHP读写MySQL

环境安装

yum install php-mysqlnd php -y

创建一个php文件

cd /opt
vim mysql_read.php

编写读取mysql数据的php脚本

<?php
/**
 * 数据库连接配置
 * 包含服务器地址、用户名、密码和数据库名
 */
$servername = "192.168.0.18";
$username = "zhangm";
$password = "123456";
$dbname = "kings";

/**
 * 创建数据库连接
 * 使用mysqli扩展连接MySQL数据库
 */
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 设置数据库连接字符集为UTF-8,确保中文正常显示
mysqli_query($conn, "SET NAMES UTF8");

// 检查数据库连接是否成功
if (!$conn) {
    die("MySQL连接失败: " . mysqli_connect_error());
}

/**
 * 执行SQL查询
 * 查询kings数据库中的tanks表所有记录
 */
$sql = "SELECT * FROM kings.tanks";
$result = mysqli_query($conn, $sql);

/**
 * 处理查询结果
 * 检查是否有数据返回并循环输出
 */
if (mysqli_num_rows($result) > 0) {
    // 循环输出每一行数据
    while ($row = mysqli_fetch_assoc($result)) {
        echo "ID: " . $row["id"] . " - 名称: " . $row["name"] . " - 技能: " . $row["skills"] . "\n";
    }
} else {
    echo "------ 未查询到数据 ------";
}

// 关闭数据库连接,释放资源
mysqli_close($conn);
?>

调用php解释器,执行这个文件

[root@mysql-01 opt]# php mysql_read.php
ID: 1 - 名称: 程咬金 - 技能: 大招回血,血量越低,伤害越高
ID: 2 - 名称: 大鱼庄周 - 技能: 免疫所有队友的负面控制
[root@mysql-01 opt]#

2、php插入数据

创建文件

vim mysql_write.php

文件写入以下内容

<?php
/**
 * 数据库连接配置
 */
$servername = "192.168.0.18";
$username = "zhangm";
$password = "123456";
$dbname = "kings";

/**
 * 创建数据库连接
 */
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 设置数据库连接字符集为UTF-8,确保中文正常写入
mysqli_query($conn, "SET NAMES UTF8");

// 检查数据库连接是否成功
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}

/**
 * 定义插入数据
 * 使用预处理语句提高安全性,防止SQL注入
 */
$sql = "INSERT INTO kings.tanks (id, name, skills, price) VALUES (?, ?, ?, ?)";
$stmt = mysqli_prepare($conn, $sql);

// 绑定参数并执行多次插入
$values = [
    [3, "吕布", "真实伤害爆棚", 18888],
    [4, "关羽", "跑起来贼快", 188888]
];

// 循环处理多条插入数据
foreach ($values as $value) {
    mysqli_stmt_bind_param($stmt, "isss", $value[0], $value[1], $value[2], $value[3]);
    if (mysqli_stmt_execute($stmt)) {
        echo "记录 {$value[1]} 插入成功<br>";
    } else {
        echo "记录 {$value[1]} 插入失败: " . mysqli_stmt_error($stmt) . "<br>";
    }
}

// 关闭预处理语句和数据库连接
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

执行

[root@mysql-01 opt]# php mysql_write.php
记录 吕布 插入成功<br>记录 关羽 插入成功

三、python读写MySQL

1.安装python3

python3脚本即可,python3读写mysql就得有—个桥梁,有—个驱动,让python3可以正确的连接上mysql,通过如下命令安装这个驱动 pymysql

yum install python3 python3-devel -y

[root@mysql-01 opt]# python3 --version
Python 3.6.8
[root@mysql-01 opt]#

2.开发python3读写mysql的脚本

创建python文件

vim python3_mysql_read_write.py

#安装一个依赖
pip3 install pymysql

输入以下内容

import pymysql
from pymysql.cursors import DictCursor

# 数据库配置
db_config = {
    'host': '192.168.0.18',
    'port': 3306,
    'user': 'zhangm',
    'password': '123456',
    'database': 'kings',
    'charset': 'utf8mb4',  # 支持中文
    'cursorclass': DictCursor  # 返回字典格式结果
}

try:
    # 使用上下文管理器自动管理连接和游标
    with pymysql.connect(**db_config) as conn:
        with conn.cursor() as cursor:
            # 插入数据(使用参数化查询防止SQL注入)
            insert_sql = "INSERT INTO tanks (id, name, skills, price) VALUES (%s, %s, %s, %s)"
            insert_data = (5, "项羽", "皮糙肉厚,贼抗打,超级坦克", 6888)
            
            rows = cursor.execute(insert_sql, insert_data)
            print(f"成功插入 {rows} 行数据")

            # 查询数据
            select_sql = "SELECT * FROM tanks"
            cursor.execute(select_sql)
            results = cursor.fetchall()
            
            # 格式化输出查询结果
            print("\n查询结果:")
            for row in results:
                print(f"ID: {row['id']}, 名称: {row['name']}, 技能: {row['skills']}, 价格: {row['price']}")

except pymysql.Error as e:
    print(f"数据库操作失败: {e}")
finally:
    print("数据库连接已关闭")

执行py脚本

[root@mysql-01 opt]# python3 python3_mysql_read_write.py
成功插入 1 行数据

查询结果:
ID: 1, 名称: 程咬金, 技能: 大招回血,血量越低,伤害越高, 价格: 8888
ID: 2, 名称: 大鱼庄周, 技能: 免疫所有队友的负面控制, 价格: 2888
ID: 3, 名称: 吕布, 技能: 真实伤害爆棚, 价格: 18888
ID: 4, 名称: 关羽, 技能: 跑起来贼快, 价格: 188888
ID: 5, 名称: 项羽, 技能: 皮糙肉厚,贼抗打,超级坦克, 价格: 6888
数据库连接已关闭
[root@mysql-01 opt]#

执行成功

进入MySQL数据库进行查看

mysql> select * from kings.tanks;
+----+--------------+----------------------------------------+--------+
| id | name         | skills                                 | price  |
+----+--------------+----------------------------------------+--------+
|  1 | 程咬金       | 大招回血,血量越低,伤害越高             |   8888 |
|  2 | 大鱼庄周     | 免疫所有队友的负面控制                 |   2888 |
|  3 | 吕布         | 真实伤害爆棚                           |  18888 |
|  4 | 关羽         | 跑起来贼快                             | 188888 |
+----+--------------+----------------------------------------+--------+
4 rows in set (0.00 sec)

mysql>

四、修改数据表

1.修改表名

#语法
rename table 旧的表名字  to 新的表名字;

mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| tanks           |
+-----------------+
1 row in set (0.00 sec)

mysql> rename table tanks to Tanks;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| Tanks           |
+-----------------+
1 row in set (0.00 sec)

mysql>

2.alter命令修改数据表的名字

#语法
alter table  当前表名    rename to 新表名;

mysql> alter table Tanks rename to TANKS;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| TANKS           |
+-----------------+
1 row in set (0.00 sec)

mysql>

3.修改数据表的字段

#查看数据表具体信息
mysql> desc tanks;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | int(11)      | NO   | PRI | 0       |       |
| name   | varchar(100) | NO   |     | NULL    |       |
| skills | varchar(255) | NO   |     | NULL    |       |
| price  | int(11)      | NO   |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

# 创建table的语句
mysql> show create table tanks;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                        |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tanks | CREATE TABLE `tanks` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(100) NOT NULL,
  `skills` varchar(255) NOT NULL,
  `price` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

3.1 添加字段

#语法
alter table 表名    add 字段名  字段的数据类型(长度)  额外的字段属性;

mysql> alter table tanks add introduction varchar(255) not null;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tanks;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   | PRI | 0       |       |
| name         | varchar(100) | NO   |     | NULL    |       |
| skills       | varchar(255) | NO   |     | NULL    |       |
| price        | int(11)      | NO   |     | NULL    |       |
| introduction | varchar(255) | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


mysql> show create table tanks;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tanks | CREATE TABLE `tanks` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(100) NOT NULL,
  `skills` varchar(255) NOT NULL,
  `price` int(11) NOT NULL,
  `introduction` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

3.2 添加指定字段的位置

mysql> alter table tanks add summoner_skills ENUM('flush','fire') not null default 'flush' after skills;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tanks;
+-----------------+----------------------+------+-----+---------+-------+
| Field           | Type                 | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+-------+
| id              | int(11)              | NO   | PRI | 0       |       |
| name            | varchar(100)         | NO   |     | NULL    |       |
| skills          | varchar(255)         | NO   |     | NULL    |       |
| summoner_skills | enum('flush','fire') | NO   |     | flush   |       |
| price           | int(11)              | NO   |     | NULL    |       |
| introduction    | varchar(255)         | NO   |     | NULL    |       |
+-----------------+----------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql>

3.3 一次性添加多个字段

alter table tanks add camp varchar(50) after price , add pic varchar(255) after camp ;

3.4 删除table的字段

alter 结合drop删除字段

#语法
alter table 表名  drop 字段;

mysql> alter table tanks drop summoner_skills;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>

3.5 修改表字段的类型

修改table字段的数据类型

#语法
alter table 表名    change 旧字段名    新字段名  新数据类型;

mysql>  alter table tanks change pic pic_url char(200);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> desc tanks;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   | PRI | 0       |       |
| name         | varchar(100) | NO   |     | NULL    |       |
| skills       | varchar(255) | NO   |     | NULL    |       |
| price        | int(11)      | NO   |     | NULL    |       |
| camp         | varchar(50)  | YES  |     | NULL    |       |
| pic_url      | char(200)    | YES  |     | NULL    |       |
| introduction | varchar(255) | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql>

五、MySQL数据表的索引创建

1.创建

mysql的索引功能,是提高mysql查询速度的一大重点,后面我们重点学习原理,这里先了解用法 索引功能,就像一本书的目录,知道目录,可以非常快速找到我们想要的内容在哪 通过给字段添加索引,能够加快该列字段的查询速度。

# 查看数据表的索引信息

mysql> show index from tanks\G
*************************** 1. row ***************************
        Table: tanks
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

mysql>

2.添加索引

给name字段,添加索引

# 语法  
alter table tanks add index 索引的名(哪—个字段);

mysql> alter table tanks add index name_index(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from tanks\G
*************************** 1. row ***************************
        Table: tanks
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: tanks
   Non_unique: 1
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
2 rows in set (0.00 sec)

mysql>

3.删除索引

mysql> alter table tanks drop index name_index;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from tanks\G
*************************** 1. row ***************************
        Table: tanks
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

mysql>

六、数据表的删除

# 删除数据库语法
drop database 数据库名;

# 删除数据表语法
drop table 表名;

delete from 删除数据表的内容

delete from 可以结合where条件语句,进行数据的指定删除,判断删除 

delete是—行—行的删除数据,对于大容量的数据表,删除效率很低

delete对于有自增id的列,数据删除后,会保留其id的位置

delete对于有自增id的列,数据删除后,会保留其id的序号

七、tuncate删除语法

truncate语句直接清空表数据,重新建立—个表 不会出现自增id的问题,重新计算id位置


mysql> select * from tanks;
+----+--------------+----------------------------------------+--------+------+---------+--------------+
| id | name         | skills                                 | price  | camp | pic_url | introduction |
+----+--------------+----------------------------------------+--------+------+---------+--------------+
|  1 | 程咬金       | 大招回血,血量越低,伤害越高             |   8888 | NULL | NULL    |              |
|  2 | 大鱼庄周     | 免疫所有队友的负面控制                 |   2888 | NULL | NULL    |              |
|  3 | 吕布         | 真实伤害爆棚                           |  18888 | NULL | NULL    |              |
|  4 | 关羽         | 跑起来贼快                             | 188888 | NULL | NULL    |              |
+----+--------------+----------------------------------------+--------+------+---------+--------------+
4 rows in set (0.00 sec)

mysql> truncate table tanks;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from tanks;
Empty set (0.00 sec)

mysql>

八、表数据查询

通过*查询

mysql> select * from tanks;
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
| id | name   | skills                         |
summoner_skills | price | camp | pic_url | introduction |
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
|  1 | 鲁班       | 二技能全图,被动扫射                     | flush
|  5888 | NULL | NULL     |              |
|  2 | 甄姬       | 技能会冰冻敌人                                   | flush
|  2888 | NULL | NULL     |              |
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
2 rows in set (0.00 sec)

指定字段查询

只想查看鲁班的技能和价格

mysql> select skills,price from tanks where name='鲁班 ';
+--------------------------------+-------+
| skills                         | price |
+--------------------------------+-------+
| 二技能全图,被动扫射                     |  5888 |
+--------------------------------+-------+
1 row in set (0.00 sec)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐