目录
1、xtrabackup备份
1、安装
# tar xf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
# ln -sv /root/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17/bin/xtrabackup /usr/bin/xtrabackup
2、使用
准备使用
mysql> CREATE USER 'bkpuser'@'%'IDENTIFIED with mysql_native_password BY 'Bak@123.com';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'%';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'%';
mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'%';
mysql> GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'%';
mysql> FLUSH PRIVILEGES;
3、完全备份
mkdir /data
[root@localhost ~]# /usr/bin/xtrabackup --backup --target-dir=/data/backups/ -u bkpuser -p'Bak@123.com' -H172.16.100.21
4、增量备份
插入数据
mysql> insert into it.Student values(7,'john','男',22,'电子商务');
第一次增量备份
# /usr/bin/xtrabackup --backup --target-dir=/data/incr1/ -u bkpuser -p'Bak@123.com' -H172.16.100.21 --incremental-basedir=/data/backups/
再次插入数据
mysql> insert into it.Student values(8,'bob','女',21,'英语'),(9,'smith','男',20,'计算机网络');
第二次增量备份
# /usr/bin/xtrabackup --backup --target-dir=/data/incr2/ -u bkpuser -p'Bak@123.com' -H172.16.100.21 --incremental-basedir=/data/incr1/
5、还原
模拟破坏数据
mysql> drop database it;
准备完全备份
# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/
应用第一次增量备份到完全备份
# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr1/
应用第二次增量备份到完全备份
# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr2/
最后执行:
xtrabackup --prepare --target-dir=/data/backups/
[root@node1 ~]# systemctl stop mysqld
[root@node1 ~]# rm -rf /var/lib/mysql/*
[root@node1 ~]# xtrabackup --copy-back --target-dir=/data/backups/
[root@node1 ~]# chown -R mysql:mysql /var/lib/mysql
[root@node1 ~]# systemctl start mysqld
2、mysqlbackup 备份还原
1、获取软件
2、安装
[root@localhost ~]# unzip V1040085-01.zip
[root@localhost ~]# dnf install mysql-commercial-backup-8.0.36-1.1.el8.x86_64.rpm
3、备份管理员
CREATE USER 'mysqlbackup'@'localhost' IDENTIFIED BY 'MySQL@123';
GRANT SELECT, BACKUP_ADMIN, RELOAD, PROCESS, SUPER, REPLICATION CLIENT ON *.*
TO `mysqlbackup`@`localhost`;
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, UPDATE, SELECT, ALTER ON mysql.backup_history
TO 'mysqlbackup'@'localhost';
GRANT LOCK TABLES, CREATE, DROP, FILE, INSERT, ALTER ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, DROP, UPDATE ON mysql.backup_sbt_history TO 'mysqlbackup'@'localhost';
GRANT ENCRYPTION_KEY_ADMIN ON *.* TO 'mysqlbackup'@'localhost';
GRANT INNODB_REDO_LOG_ARCHIVE ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP ON mysql.backup_progress_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_progress_new TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP ON mysql.backup_history_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_history_new TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP ON mysql.backup_sbt_history_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_sbt_history_new TO 'mysqlbackup'@'localhost';
1. backup-to-image方式的全量备份与还原
备份image
备份命令:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-image=my_full_bak.mbi \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
参数解释:
–backup-image:生成的备份image名称
–backup-dir:生成的备份image所在目录
–show-progress:显示备份进度[可选项]
–compress:对备份image进行压缩节省空间[可选项]
–with-timestamp:在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image以及其它相关文件
backup-to-image:声明这是备份为image的备份
备份后目录结构如下:
[root@localhost ~]# ll /data/backup/2024-02-20_11-15-31/
total 7.2M
-rw-r--r-- 1 root root 255 Feb 20 11:15 backup-my.cnf
drwxr-x--- 2 root root 4.0K Feb 20 11:15 datadir
drwxr-x--- 2 root root 4.0K Feb 20 11:15 meta
-rw-r----- 1 root root 7.2M Feb 20 11:15 my_full_bak.mbi
-rw-r----- 1 root root 20K Feb 20 11:15 server-all.cnf
-rw-r----- 1 root root 778 Feb 20 11:15 server-my.cnf
查看与检验image
可以通过list-image查看备份image中的文件内容 list命令:
[root@localhost ~]# mysqlbackup --backup-image=/data/backup/2024-02-20_11-15-31/my_full_bak.mbi list-image
可以通过validate验证备份image的有效性
validate命令:
[root@localhost ~]# mysqlbackup --backup-image=/data/backup/2024-02-20_11-15-31/my_full_bak.mbi validate
还原image
还原数据库备份之前必须做完成以下前提:
关闭mysqld服务
清空mysql的datadir目录
还原命令:
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/backup/2024-02-20_11-15-31/my_full_bak.mbi \
--backup-dir=/data/backup/2024-02-20_11-15-31/tmp \
--uncompress \
copy-back-and-apply-log
参数解释:
–datadir : mysql server的数据库datadir,数据将还原至此
–backup-image:image备份的路径与名称
–backup-dir: image临时工作目录用于释放image都此目录,必须为空
–uncompress[可选项]
copy-back-and-apply-log:应用redolog并且copy datafile至datadir
2. backup-to-image方式的增量备份与还原
备份image
先做全备:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-image=my_full_bak.mbi \
--backup-dir=/data/backup/ \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
再做增备[方式一]:
[root@localhost opt]# mysql -e "insert into it.Student values(10,'李宁','男',23,'导弹专业')"
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--compress \
--incremental \
--incremental-base=dir:/data/backup/2024-02-20_11-15-31 \
--backup-dir=/data/backup/incr1 \
--backup-image=my_inc1_bak.mbi \
backup-to-image
再做增备[方式二]:
[root@localhost opt]# mysql -e "insert into it.Student values(11,'李刚','男',23,'导弹专业')"
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--compress \
--incremental \
--incremental-base=history:last_backup \
--backup-dir=/data/backup/incr2 \
--backup-image=my_inc_bak.mbi \
backup-to-image
你一定会问:增量备份[方式一]和增量备份[方式二]有什么区别呢? 首先看它俩表面的区别在于–incremental-base的写法: 方式一: --incremental-base=dir:/data/backup/2022-04-14_00-39-35 方式二: --incremental-base=history:last_backup
–incremental-base=dir:/data/backup/2022-04-14_00-39-35是上次全备或增备所在目录,那么这次增量备份就要基于这个目录中的备份为基准。 –incremental-base=history:last_backup是直接使用history:last_backup代替上一次的备份,省去人工寻找目录的麻烦,MEB会自动到backup_history表中查找上一次备份的目录。 这是MEB为我们做的易用性改进。
多个增量备份,只需要多次执行上面的命令即可。
还原image
先还原全备:
还原数据库备份之前必须做完成以下前提:
关闭mysqld服务
清空mysql的datadir目录
还原全备命令:
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/backup/2024-02-20_11-15-31/my_full_bak.mbi \
--backup-dir=/data/backup/2024-02-20_11-15-31/tmp \
--uncompress \
copy-back-and-apply-log
再还原增备: 还原增备命令:
mysqlbackup --backup-image=/data/backup/incr1/my_inc1_bak.mbi \
--backup-dir=/data/backup/incr1/tmp \
--datadir=/var/lib/mysql/ \
--incremental \
copy-back-and-apply-log
第二次增量还原
mysqlbackup --backup-image=/data/backup/incr2/my_inc_bak.mbi \
--backup-dir=/data/backup/incr2/tmp \
--datadir=/var/lib/mysql/ \
--incremental \
copy-back-and-apply-log
多个增量还原,只需要多次执行上面的命令即可。注意----backup-image每次都要用当前增量备份的目录。
3. datafile方式的全量备份与还原
备份datafile
备份命令:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup
参数解释:
–backup-dir:生成的备份datafile所在目录
–show-progress:显示备份进度[可选项]
–compress:对备份image进行压缩节省空间[可选项]
–with-timestamp:在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image以及其它相关文件
backup:声明这是备份为datafile的备份
备份后目录结构如下:
ll 2022-04-13_17-32-49/datadir
total 2768
-rw-r----- 1 root root 56 Apr 13 17:32 backup-auto.cnf
-rw-r----- 1 root root 1965 Apr 13 17:32 binlog.000006.bz
-rw-r----- 1 root root 16 Apr 13 17:32 binlog.index
-rw-r----- 1 root root 7680 Apr 13 17:32 ibbackup_logfile
-rw-r----- 1 root root 5196 Apr 13 17:32 ib_buffer_pool
-rw-r----- 1 root root 50974 Apr 13 17:32 ibdata1.ibz
drwxr-x--- 2 root root 196 Apr 13 17:32 mysql
-rw-r----- 1 root root 2405933 Apr 13 17:32 mysql.ibz
drwxr-x--- 2 root root 8192 Apr 13 17:32 performance_schema
drwxr-x--- 2 root root 28 Apr 13 17:32 sys
-rw-r----- 1 root root 508 Apr 13 17:32 tablespaces_tracker
drwxr-x--- 2 root root 209 Apr 13 17:32 ttecdis
-rw-r----- 1 root root 152091 Apr 13 17:32 undo_001.uz
-rw-r----- 1 root root 171493 Apr 13 17:32 undo_002.uz
12345678910111213141516
还原datafile
还原数据库备份之前必须做完成以下前提:
关闭mysqld服务
清空mysql的datadir目录
分步还原 第一步:apply-log 因为在备份期间数据库还在读写,把这期间产生的redolog贴回数据文件上,以达到数据一致性
mysqlbackup --backup-dir=/data/backup/2022-04-13_17-32-49 \
--uncompress \
apply-log
第二步:copy-back
把已经达到数据一致性的数据文件copy到mysql的datadir目录下,此时不能再用uncompress参数,因此apply-log时已经uncompress过了。
mysqlbackup --datadir=/data/mysql/data --backup-dir=/data/backup/2022-04-13_17-32-49 \
copy-back
合并还原
以上两步可以合为一步完成,即把apply-log与copy-back合并为copy-back-and-apply-log,它首先会把redolog贴回datafile并初始化新的redolog,然后把backupdir目录下的全部数据copy回mysql datadir
mysqlbackup --datadir=/var/lib/mysql/ --backup-dir=/data/backup/2022-04-13_17-32-49 \
--uncompress \
--show-progess \
copy-back-and-apply-log
参数解释:
–datadir: mysql server的datadir目录,就是要还原到这里
–backup-dir:生成的备份datafile所在目录
–show-progress:显示还原进度[可选项]
–uncompress[可选项]
–apply-log: 把备份期间的redo log贴回datafile
–copy-back:把datafile复制回datadir目录
–copy-back-and-apply-log:把备份期间的redo log贴回datafile再把datafile复制回datadir目录
聪明的你一定发现了,在使用以上两种备份方式进行备份时都加了–compress参数,为什么还原的时候–uncompress参数却是可选项呢? 因为mysqlbackup 8.0.21版本开始可以识别备份是否为compress,如果是,那么它在还原时会自动uncompress,不需要显示告诉它。 在mysqlbackup 4.X以及8.0.21之前版本是必须要显示指定uncompress的。
4. datafile方式的增量备份与还原
备份datafile
先做全备:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup
再做增备[方式一]:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--with-timestamp \
--compress \
--incremental \
--incremental-base=dir:/data/backup/2022-04-14_02-09-39 \
--incremental-backup-dir=/data/backup \
backup
再做增备[方式二]:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--with-timestamp \
--compress \
--incremental \
--incremental-base=history:last_backup \
--incremental-backup-dir=/data/backup \
backup
多个增量备份,只需要多次执行上面的命令即可。
还原datafile
先全备apply-log:
还原数据库备份之前必须做完成以下前提:
关闭mysqld服务
清空mysql的datadir目录
全备apply-log命令:
mysqlbackup --backup-dir=/data/backup/2022-04-14_02-09-39 \
apply-log
再增备apply-incremental-backup
增备apply-incremental-backup命令:
mysqlbackup --incremental-backup-dir=/data/backup/2022-04-14_02-15-27 \
--backup-dir=/data/backup/2022-04-14_02-09-39 \
apply-incremental-backup
多个增量还原,只需要多次执行上面的命令即可。注意–incremental-backup-dir每次都要用当前增量备份的目录。
最后将备份copy-back到datadir
将备份copy-back到datadir命令:
mysqlbackup --datadir=/data/mysql/data --backup-dir=/data/backup/2022-04-14_02-09-39 \
copy-back-and-apply-log
5. 还原后如何启动mysqld服务
还原后,datadir目录下的数据文件用户属组不是mysql,因此要修改其属组,否则mysqld访问无法启动。 修改属组命令:
chown mysql.mysql /var/lib/mysql/ -R
启动mysqld服务:
systemctl start mysqld
6. 配置安全使用mysqlbackup
严谨的朋友已经发现在以上命令中存在安全漏洞:用户名和密码是明文写在命令中的,且命令冗长,不易操作。
如何配置能让mysqlbackup更安全呢? 将socket、user、password写到my.cnf中,mysqlbackup --defaults-file=/etc/my.cnf方式吗?掩耳盗铃罢了,因为在my.cnf中同样是明文的。
这里我们使用mysql_config_editor来处理,既能隐藏密码,又能减少命令复杂度。 mysql_config_editor 是什么,读者可以自行查阅官方文档,下面直接上命令:
配置:
将mysqlbackup要使用的登录连接信息通过mysql_config_editor加密保存起来:
mysql_config_editor set --login-path=backup --user=mysqlbackup --password --socket=/var/lib/mysql/mysql.sock
Enter password:##此处输入password后回车
查看:
看一看加密保存的信息:
mysql_config_editor print --login-path backup
[backup]
user = "mysqlbackup"
password = *****
socket = "/var/lib/mysql/mysql.sock"
可以看到,除了保存了user、socket外,还加密保存了密码。
改造:
mysqlbackup命令就可以如下改造,直接调用此加密信息:
改造前:
mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
--backup-image=my_full_bak.mbi \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
改造后:
mysqlbackup --login-path=backup \
--backup-image=my_full_bak.mbi \
--backup-dir=/data/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
通过改造前后对比,安全性与易用性都得到加强。
7. 进阶
上面讲解了mysqlbackup的常规用法,其实它还有很多高级功能,比如:
-
备份加密
-
磁带备份
-
创建主从复制
-
创建组复制
-
指定备份对象
-
指定还原对象 有兴趣的朋友可以继续深入研究,官方文档在此。