做一下SQL基础教程的课后作业,发现有一个删除表数据后的恢复操作,书中并没有提及相关的操作,查询实操一下,先写一下MySQL数据备份和恢复。
MySQL常用的三种备用方法,物理备份xtrabackup、逻辑备份mysqldump和 binlog备份。
一、xtrabackup物理备份
1.xtrabackup安装
Percona-xtrabackup是一款用于MySQL数据库物理热备的备份工具,下载地址如下
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
我下载的是rpm包安装,测试机我已经安装了MySQL-8.0.23,可能有一部分依赖包已经被安装,我只把这次安装的依赖包放出来,环境不一样的,有缺失的库文件请自行安装。
yum install mysql-community-libs-compat-8.0.23-1.el7.x86_64.rpm \ libev-4.15-3.el7.x86_64.rpm \ percona-xtrabackup-80-8.0.22-15.1.el7.x86_64.rpm \ percona-xtrabackup-test-80-8.0.22-15.1.el7.x86_64.rpm \ percona-xtrabackup-80-debuginfo-8.0.22-15.1.el7.x86_64.rpm -y
2.全量备份和增量备份
xtrabackup有两个工具,xtrabackup和innobackupex,前者用于热备innodb和xtradb表的工具,后者是进行封装的perl脚本,备份myisam表工具。
xtrabackup \ --user=root \ --password='password' \ --host=localhost \ --backup \ --target-dir=/root/db-bak/base \ --datadir=/var/lib/mysql \ --no-server-version-check # --target-dir是备份文件所在目录 # --datadir是MySQL的文件位置,默认目录是/var/lib/mysql # --no-server-version-check这里有xtrabackup与MySQL的版本适用问题,这个参数可以不检测Server版本,有风险,最好选用支持的版本
以上就是全量备份的过程,下面是在全量备份的基础上做增量备份。
#在第一次全量备份的基础上进行一次增量备份 xtrabackup --user=root --password='password' --host=localhost --backup --target-dir=/root/db-bak/inc1 --incremental-basedir=/root/db-bak/base/ --datadir=/var/lib/mysql --no-server-version-check #在第一次增量备份的基础上进行二次增量备份 xtrabackup --user=root --password='password' --host=localhost --backup --target-dir=/root/db-bak/inc2 --incremental-basedir=/root/db-bak/inc1/ --datadir=/var/lib/mysql --no-server-version-check
3.预恢复
以上的操作都是参考man xtrabackup进行的,在进行预恢复阶段,提到了--prepare和--apply-log-only参数,前者就代表预恢复操作,后者代表不要回滚事物,增量备份的恢复时一步一步进行的,在没有进行到所有增量备份都恢复之前都需要加这个参数,在最后一步恢复的时候去掉该参数。
是的,遇到BUG了,8.0.22的xtrabackup和8.0.23的MySQL搭配有问题的,又要花时间重新安装MySQL-8.0.22,后面再继续分享。
我又回来了,MySQL-8.0.22的安装和8.0.23的安装没有啥太大的区别,和我之前介绍的差不多,这一次进行上述备份操作的时候不需要再加--no-server-version-check参数了,备份操作没有错误信息,下面继续预恢复。
xtrabackup --prepare --apply-log-only --target-dir=/root/database-backup/base/ //全量预回复 xtrabackup --prepare --apply-log-only --target-dir=/root/database-backup/base/ --incremental-dir=/root/database-backup/inc1/ //第一次增量恢复到全量备份中 xtrabackup --prepare --target-dir=/root/database-backup/base/ --incremental-dir=/root/database-backup/inc2 //第二次增量备份恢复到全量备份中 systemctl stop mysqld //停掉mysqld服务 cd /var/lib/mysql rm ./* -rf //好吧这个命令慎用,一点之差全局完蛋!!!!!!,这时候数据库的数据已经被清空了
4.恢复
xtrabackup --copy-back --target-dir=/root/database-backup/base/ chown -R mysql.mysql /var/lib/mysql systemctl start mysqld
这时候再打开/var/lib/mysql数据库就有数据了,这时候我们再进行查询一下。
use product; select id,product_name,product_price from price; +----+--------------+---------------+ | id | product_name | product_price | +----+--------------+---------------+ | 1 | 面包 | 5 | | 2 | 香肠 | 3.5 | | 3 | 方便面 | 3 | | 4 | 牛奶 | 8.3 | +----+--------------+---------------+
好了,大功告成,其实在删除文件之前,我已经用delete删除了这个表的内容,还是恢复了,以上操作完全经过实操,可以参考,下面整个邮件服务器,然后再搞个定期全备,增量备份的自动化脚本,里面加一些备份信息发邮件的设置就ok了,继续加油!
二、mysqldump逻辑备份
mysqldump之所以成为逻辑备份,是因为它不复制数据,而是将需要备份的数据查询出来,转化成insert语句,这种备份方式在备份速度、恢复速度和物理备份工具相比较慢,而且mysqldump的备份是串行的,不会并行备份,数据量大的时候,效率低,一般不用。支持innodb热备,支持myisam温备,会锁表。
测试一下啊