已经很多年没有维护过mysql了,之前维护的mysql都是用的myisam引擎,所以备份会比较简单,最近帮朋友迁移了一个innodb的引擎,发现备份跟myisam的引擎有点差异。当然如果都采用mysqldump备份是一样的,但是比较慢。
如果大家要学习做实验,请谨慎用线上DB环境来做测试,尽量用测试环境
一、系统环境
CentOS Linux release 7.9.2009 (Core)
#mysql版本
Percona-Server-shared-compat-57-5.7.33-36.1.el7.x86_64
Percona-Server-client-57-5.7.33-36.1.el7.x86_64
Percona-Server-server-57-5.7.33-36.1.el7.x86_64
Percona-Server-shared-57-5.7.33-36.1.el7.x86_64
二、安装备份软件
这里选择Percona公司出的备份软件,用这个软件进行备份,可以热备,就是不用停db也能进行完全备份,也可以增量备份,尽量选高版本的,低版本有不少bug,还有这个备份软件是用perl写的,所以需要安装不少perl相关的软件,不然会报错
yum -y install perl perl-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5
cd /root
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/tarball/percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
tar -zxf percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
cp -R percona-xtrabackup-2.4.8-Linux-x86_64 /usr/local/percona-xtrabackup
#配置一下环境变量
echo "export PATH=/usr/local/percona-xtrabackup/bin:$PATH" >>/etc/profile
source /etc/profile
三、完全备份
#这里演示的是完全备份,包括里面所有的库以及mysql权限库,也可以指定其中一库,增量备份比较复杂,大家有兴趣,可以自已查找资料
innobackupex --de--defaults-file=/etc/percona-server.conf.d/mysqld.cnf --host=localhost -S /var/lib/mysql/mysql.sock --user=root --password=xxxxx --parallel=8 --check-privileges --no-version-check --lock-ddl-per-table --backup /opt/backup
#看到最后的日志,代表备份成功
221012 18:17:09 Finished backing up non-InnoDB tables and files
221012 18:17:09 Executing LOCK BINLOG FOR BACKUP...
221012 18:17:09 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '1498923077023'
xtrabackup: Stopping log copying thread.
.221012 18:17:09 >> log scanned up to (1499214744695)
221012 18:17:09 Executing UNLOCK BINLOG
221012 18:17:09 Executing UNLOCK TABLES
221012 18:17:09 All tables unlocked
221012 18:17:09 [00] Copying ib_buffer_pool to /opt/backup/2022-10-12_18-13-32/ib_buffer_pool
221012 18:17:09 [00] ...done
221012 18:17:09 Backup created in directory '/opt/backup/2022-10-12_18-13-32/'
221012 18:17:09 [00] Writing /opt/backup/2022-10-12_18-13-32/backup-my.cnf
221012 18:17:09 [00] ...done
221012 18:17:09 [00] Writing /opt/backup/2022-10-12_18-13-32/xtrabackup_info
221012 18:17:09 [00] ...done
xtrabackup: Transaction log of lsn (1498920598975) to (1499214744695) was copied.
221012 18:17:09 completed OK!
#--lock-ddl-per-table这个参数很重要,因为我们是热备,没有停db的备份,相当于在备份的过程中,数据同时还有写入,如果不加这个参数,在备份过程中会有可能失败。
#/opt/backup,这个是备份目标存储的目录
还有别的很多参数,大家可以上网查一下,这个备份软件有很多功能,可以同时并行多线程,还可以同时进行数据压缩,流式备份等等。备份成功后会在"/opt/backup"目录下以时间生成一个备份目 录,类似"2022-10-12_18-13-32",当然生成目录名也可以自定义。
四、数据恢复
上面介绍了如何备份,备份完同时也要验证一下备份的数据恢复后是否正确,这样备份才算是有效的。
首先恢复的环境要保证跟备份时的数据库版本,以及my.cnf配置保持一样
1、先停掉mysql服务
停掉mysql服务,然后要把mysql原来目录下的数据全部删除,比如我们把mysql的数据存在/var/lib/mysql下,这里要把/var/lib/mysql下的数据全部删除。
2、检查备份数据
innobackupex --apply-log /opt/backup/2022-10-12_18-13-32
#看到以下日志代表,数据检查没有问题
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: Removed temporary tablespace data file: "ibtmp1"
InnoDB: Creating shared tablespace for temporary tables
InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
InnoDB: File './ibtmp1' size is now 12 MB.
InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.
InnoDB: 32 non-redo rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: 5.7.19 started; log sequence number 1499214750229
InnoDB: page_cleaner: 1000ms intended loop took 22469ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1499214750772
221012 18:22:03 completed OK!
3、开始恢复数据
innobackupex --defaults-file=/etc/percona-server.conf.d/mysqld.cnf --copy-back 2022-10-12_18-13-32
4、启动mysql服务
在恢复数据完后,需要对恢复的数据目录修改一下权限
chown -R mysql.mysql /var/lib/mysql
然后启动mysql服务,验证一下