MySQL权限管理与备份

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 删除表中内存的权限

MySQL中的用户权限 | 左老师的课堂笔记

赋予用户权限

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进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。