一、前言
笔者之前写过 《MySQL 性能优化技巧》 文章,但没有涉及到 MySQL 安全方面的知识。虽说这是 DBA 需要学习的内容与后端开发人员关系不大,但俗话说技多不压身,即便不深入学习,也需要对其相关内容有所了解。
测试环境 MySQL 5.7.20
以下便是笔者浅学后的内容总结。
二、用户相关
创建新用户并合理地设置权限是安全的保障。
2.1 新建用户
1 | mysql> create user 用户名 identified by "密码" |
使用新用户名登录后,由于没有权限只能查看一个数据库:
1 | mysql> show databases; |
2.2 修改用户名
1 | mysql> rename user 旧用户名 to 新用户名 |
2.3 修改密码
不需要登录 MySQL 的情况:
1 | shell> mysqladmin -u 用户名 -p password "新密码" |
登陆 MySQL 后,修改新密码的情况,有如下几种方式:
1 | mysql> alter user 'root'@'localhost' IDENTIFIED BY '新密码' |
1 | mysql> alter user user() IDENTIFIED BY '新密码' |
1 | mysql> SET PASSWORD FOR 'root'@'localhost' = '新密码' |
1 | mysql> SET PASSWORD = '新密码'; |
1 | mysql> grant usage on *.* to "用户名"@"%" identified by "新密码" |
针对 MySQL 5.7.6 以上版本,以上命令在设置密码时,不需要使用 password() 给密码加密。
忘记密码,需要重置密码的情况:
- 关闭 MySQL 服务
1 | shell> service mysqld stop |
- 创建临时启动文件(/root/mysql-init),内容如下:
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; |
- 启动 MySQL 服务
1 | shell> mysqld --user=root --init-file=/root/mysql-init & |
- MySQL 服务启动后,删除 /root/mysql-init 文件。
踩坑提醒:
将 /root/mysql-init 文件删除后,笔者执行 service mysqld stop 和 service mysqld start 启动就报错:
1 | [ERROR] Could not open unix socket lock file /var/lib/mysql/mysql.sock.lock |
通过 ll /var/lib/mysql/ 查看 mysql.sock.lock 所属用户和用户组,发现是 root 权限。
而 mysqld 命令启动使用的是普通用户的权限,因此无法打开文件。
于是笔者将其修改成 mysql 用户和 mysql 组启动成功:
1 | chown -R mysql:mysql /var/lib/mysql/mysql.sock |
2.4 删除用户
1 | mysql> drop user 用户名 |
drop 命令还可以删除多个用户,多个用户名通过 “,” 隔开。
三、授权相关
MySQL 提供了许多权限类型,读者可以参考文章末尾的资料了解更多知识。
为了测试方便,笔者使用 all 权限进行测试。
3.1 全局级别
授权:
1 | mysql> grant all on *.* to 用户名 |
撤销权限:
1 | mysql> revoke all on *.* from 用户名 |
其中, * 分别表示库名和表名。
3.2 数据库级别
授权:
1 | mysql> grant all on 数据库名.* to 用户名 |
撤销权限::
1 | mysql> revoke all on 数据库名.* from 用户名 |
3.3 表级别
授权:
1 | mysql> grant select,insert,update on 数据库名.表名 to 用户名 |
四、备份数据
4.1 物理备份
时机:数据库服务关闭。如果需要运行数据库备份,需要锁定数据库避免在备份期间数据产生变化。
方式:直接拷贝数据库目录和文件(/var/lib/mysql)。
优点:备份速度比逻辑备份快,且包含日志文件和配置文件等信息。
4.2 逻辑备份
时机:数据库服务开启。
4.2.1备份所有数据库
1 | shell>mysqldump -h 主机名 -u 用户名 -p --all-databases > dump.sql |
如果不是远程备份,主机名参数可以省略。
4.2.2 备份指定数据库
1 | shell>mysqldump -h 主机名 -u 用户名 -p --databases 库名1 [库名2 ...] > dump.sql |
备份多个数据库,库名之间使用空格隔开。
4.2.3 备份指定数据库表
1 | shell>mysqldump -h 主机名 -u 用户名 -p 库名 表名1 [表名2 ...] > dump.sql |
备份多张表,表名之间使用空格隔开。
五、还原数据
5.1 物理备份还原
直接将备份目录放在数据库数据目录下(/var/lib/mysql)。
5.2 逻辑备份还原
针对所有数据库:
1 | shell> mysql -uroot -p < dump.sql |
或
1 | mysql> source dump.sql |
针对某个库还原:
1 | shell> mysql -uroot -p 库名 < dump.sql |