MySQL权限管理
设置密码权限管理
root 根用户 (超级管理员)
用户信息表:mysql.user
查看用户信息:select user, host from mysql.user;
刷新权限
flush privileges;
安装并激活密码规则插件
install plugin validate_password soname 'validate_password.so';
进行查看密码强度
show variables like 'validate_password%';
进行设值密码强度为低,但是密码至少8位
set global validate_password_policy = 0;
set global validate_password_policy = low;
创建用户
create user '用户名'@'地址' identified by '密码(字符串)' ;
查看用户信息
select user, host from mysql.user;
增加本地用户
create user 'tom'@'localhost' identified by '12345678';
增加远程用户
create user 'tom'@'%' identified by '12345678';
MySQL中的用户由两部分构成
username 例如:root
host 例如:localhost(本机)、192.168.8.20、192.168.8.%、%
tom'@'localhost'和'tom'@'%' 主机名不同,不是同一个用户
修改用户名
rename user '旧的用户名'@'地址' to '新的用户名'@'地址';
rename user 'tom'@'%' to 'tom2'@'%';
修改密码
修改MySQL5.x时
root修改自己的密码
set password = password('密码');
修改其他用户的密码
set password for 'tom'@'%'=password('12345678');
修改MySQLL8.x时
alter user'用户'@'地址' identified by '密码';
alter user 'tom'@'%' identified by '12345678';
flush privileges;
删除用户
drop user 用户名;
drop user tom2;
给用户设置权限
权限列表
all 除了授权之外的所有权限
select 查询表的权限
update 修改表内容权限
insert 在表中添加内容的权限
delete 删除表中内存的权限
赋予用户权限
grant 权限列表 on 库.表 to '用户'@'地址';
grant all privileges on school.* to "tom" @"%"; #赋予tom所有权限
grant select,update,insert,delete *.* to 'zhangsan'@'192.168.8.%';
查看权限
查看权限
select * from mysql.user\G;
show grants for 用户名; #查看当前用户权限
show grants for root@localhost;
show grants; #查询所有用户权限
show grants for current_user;
show grants for current_user();
删除权限
撤消用户的某个权限
revoke 权限列表 on 库名.表名 from '用户名'@'地址';
revoke all privileges on *.* from 'tom'@'localhost';
MySQL备份
为了防止数据丢失、方便数据迁移,建议定期备份数据库中的数据。
逻辑备份:将数据库中库和表转换为SQL语句,生成.sql文件。还原数据时只需要运行该SQL语句。适合中小型规模的数据,30GB以内数据。数据量过大时,转换效率慢。
物理备份:将数据库的data目录,直接复制备份。
冷备份:关闭MySQL-Server后进行的备份。
热备份:使用专业的数据备份工具,在服务运行中备份。
全量备份:每次备份都备份所有的数据。
增量备份(差异备份):只备份新增的数据或不一样的数据。
逻辑备份
使用mysqldump工具进行逻辑备份
|-------------|------------|
| 常用的选项 ||
| 选项 | 意思 |
| -u | 指定用户名 |
| -p password | 指定密码 |
| -h | 指定服务器IP或域名 |
| -p port | 指定连接端口 |
| -e | 执行SQL语句并退出 |
备份
mysqldump -uroot -proot123 库>库.sql
mysqldump -u用户 -p密码 test>test.sql
在其他主机远程备份
-h地址 远程备份
mysqldump -uroot -proot123 -h192.168.8.20 test>test.sql
备份压缩
mysqldump -uroot -p test| gzip > test.sql.gz
添加备份时间
mysqldump -uroot -p test |gzip > test-`date +"%Y-%m-%d-%H-%M-%S"`.sql.gz
备份同个库多(单)个表
mysqldump -uroot -p test --tables user_info > user_info.sql
同时备份多个库
mysqldump -uroot -p --databases test --databases mysql --databases school > demo.sql
备份所有的数据库
mysqldump -uroot -p --all-databases > all.sql
备份数据库结构,不备份数据
mysqldump -uroot -p --no-data test > test.sql
还原
进入数据库还原
①进入数据库
mysql -uroot -p
②执行SQL文件
source test.sql
不进入数据库还原
①不进入数据库恢复
mysql -uroot -proot123 test < test.sql
②恢复所有数据
mysql -uroot -proot123 < all.sql
使用第三方工具
物理备份
冷备份
备份
1.暂停MySQL服务
systemctl stop mysql
2.创建备份目录
mkdir /bak
3.复制数据库的data目录
cp /usr/local/mysql/data /bak/2025/8/11/data
4.重启MySQL服务
systemctl start mysql
还原
1.暂停MySQL服务
systemctl stop mysql
2.清除数据库的data目录
rm -rf /usr/local/mysql/data
3.还原数据库data目录
cp -r /bak/2025/8/11/data /usr/local/mysql/
4.修改权限
chown mysql.mysql -R /usr/local/mysql/data
5.重启MySQL服务
systemctl start mysql
热备份
Xtrabackup:percona免费的数据热备工具
Hotbackup:percona收费版数据热备份
CentOS7 安装Xtrabackup 8.0
1.安装Percona yum存储库
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
2.启用Percona Server 8.0存储库
percona-release enable-only tools release
percona-release setup ps80
3.安装依赖环境
yum -y install libev perl-DBD-mysql perl-Digest-MD5 epel-release
若有问题,尝试:
①删除错误的repo文件
rm -f /etc/yum.repos.d/CentOS-Base.repo
②重新下载正确的CentOS7官网repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
③清理缓存并重试安装
yum clean all && yum makecache
yum -y install libev perl-DBD-mysql perl-Digest-MD5 epel-release
4.安装
yum -y install percona-xtrabackup-80-8.0.12
5.安装成功后测试版本
xtrabackup --version
如果成功安装,则会显示Xtrabackup的版本信息。
安装完成后,我们就可以使用Xtrabackup进行MySQL数据库备份和恢复操作了。
全量备份
创建备份目录并备份
1.在备份服务器上创建一个目录,用于存储备份文件。
mkdir /bak/
2.备份
全量备份,如果远程备份需要添加参数--host=IP,删除--socket参数
xtrabackup --defaults-file=/etc/my.cnf \
--user=root \
--password=root123 \
--port=3306 \
--socket=/tmp/mysql.sock \
--datadir=/usr/local/mysql/data \
--backup \
--target-dir=/bak/full
这将备份MySQL数据目录(/usr/local/mysql/data)到指定的目录(/bak/full )中。
全量还原
1.首先停止MySQL服务,并确保MySQL数据目录为空
systemctl stop mysqld
2.进行恢复
合并数据文件和日志文件,确保数据完整性。
xtrabackup --prepare \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
全备的恢复
xtrabackup --copy-back \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
修复所有者和权限
chown -R mysql:mysql /usr/local/mysql/data
启动MySQL
systemctl start mysqld
登录测试
mysql -uroot -proot123
show databases;
增量备份
创建备份目录并备份
mkdir /bak/{inc1,inc2}
第一次增量备份
xtrabackup --defaults-file=/etc/my.cnf \
--user=root \
--password=root123 \
--port=3306 \
--socket=/tmp/mysql.sock \
--datadir=/usr/local/mysql/data \
--backup \
--target-dir=/bak/inc1 \
--incremental-basedir=/bak/full
第二次增量备份
xtrabackup --defaults-file=/etc/my.cnf \
--user=root \
--password=root123 \
--port=3306 \
--socket=/tmp/mysql.sock \
--datadir=/usr/local/mysql/data \
--backup \
--target-dir=/bak/inc2 \
--incremental-basedir=/bak/inc1
增量还原
1.首先停止MySQL服务,并确保MySQL数据目录为空。
systemctl stop mysqld
2.进行恢复
增量备份的恢复,需要恢复增量备份到完全备份
(1)准备全备
预处理,此选项--apply--log-only 阻止回滚未完成的事务
xtrabackup --prepare --apply-log-only --target-dir=/bak/full
(2)将第一次增备添加到全备中
xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc1
(3)将第二次增备添加到全备中
xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc2
(4)将合并后的完备再一次准备复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
①合并数据文件和日志文件,确保数据完整性。
xtrabackup --prepare \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
若有问题,尝试:
a.备份当前备份目录,防止误操作导致数据丢失
cp -r /bak/full /bak/full_backup_$(date +%F)
b.检查备份文件完整性
确认 /bak/full 目录中是否包含完整的表空间文件(如 ibdata1、数据库表文件)和事务日志文件(ib_logfile0、ib_logfile1)
ls -l /bak/full | grep -E "ibdata1|ib_logfile"
若缺少 ib_logfile*,可能是备份时未正确捕获日志文件,需从原始数据库目录(/usr/local/mysql/data)复制对应文件到 /bak/full
cp /usr/local/mysql/data/ib_logfile* /bak/full/
c.重新执行prepare操作
先清理可能的残留锁文件
rm -f /bak/full/xtrabackup_*_done
重新执行 prepare(不加 --apply-log-only,适用于全量备份最终恢复)
xtrabackup --prepare \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
②全备的恢复
xtrabackup --copy-back \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
这将从备份中复制数据文件到MySQL数据目录,并将权限设置正确。
若有问题,尝试:
a.确认目标目录状态
查看目录内容
ls -l /usr/local/mysql/data
b.清空目标目录
停止 MySQL 服务(必须先停服务,否则文件可能被锁定)
systemctl stop mysqld
备份当前目录(可选,但建议保留以防万一)
mv /usr/local/mysql/data /usr/local/mysql/data_old_$(date +%F)
创建空目录并设置权限(与原目录一致)
mkdir -p /usr/local/mysql/data
确保属主是 MySQL 运行用户
chown -R mysql:mysql /usr/local/mysql/data
c.重新执行copy-back
xtrabackup --copy-back \
--datadir=/usr/local/mysql/data \
--target-dir=/bak/full
(5)修复所有者和权限
chown -R mysql:mysql /usr/local/mysql/data
(6)启动MySQL
systemctl start mysqld
(7)登录测试
mysql -uroot -proot123
show databases;
Xtrabackup与mysqldump区别
Xtrabackup属于物理备份,mysqldump属于逻辑备份。
Xtrabackup占用的CPU与内存较少,消耗的IO相对较大,备份后的文件较大。
通过mysql自带的工具mysqldump进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。