xtrabackup介绍
percona公司的备份工具,性能比较高。物理备份工具。
- 特点:
物理备份工具,在同级数据量基础上,都要比逻辑备份性能要好的多。 特别是在数据量比较大的时候,体现的更加明显。 - 备份方式:
1、拷贝数据文件
2、拷贝数据页 - 备份原理
1、对于innodb表,可以实现热备
(1)在数据还有修改操作的时刻,直接将数据文件中的数据页备份,此时,备份走的数据对于当前mysql来讲是不一致。
(2) 将备份过程中的redo和undo一并备走。
(3)为了恢复的时候,只要保证备份出来的数据页LSN能和redo LSN匹配,将来恢复的就是一致的数据。
(4)redo应用和undo的应用。
2、对与myisam表,实现自动锁表拷贝文件。
xtrabackup安装
- 安装依赖包
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
-
安装xtrabackup
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
-
备份命令(全量备份)
innobackupex /data/mysql/backup/ #最简单的备份方式
#这是个最简单的备份方式,但是需要满足几个条件
1.你的my.cnf配置文件是放在/etc/my.cnf,并且my.cnf中指定的socket文件
2.你的数据库是没有密码的
否则请用以下方式备份:innobackupex --defaults-file=/application/mysql/my.cnf --user=root --password=123456 /data/mysql/backup/
# --defaults-file 指定你的配置文件
# --user 数据库用户名
# --password 数据库密码
以上条件都满足的时候,有人会碰到这个问题:[root@db01 mysql]# innobackupex --user=root --password=123456 --defaults-file=/application/mysql/my.cnf /data/mysql/backup/ xtrabackup: Error: --defaults-file must be specified first on the command line [root@db01 mysql]# innobackupex --defaults-file=/application/mysql/my.cnf --user=root --password=123456 /data/mysql/backup/ 190817 09:07:47 innobackupex: Starting the backup operation
让史上英语最牛的人给你解答:需要把--defaults-file 作为第一个参数
-
查看备份后的文件,xtrabackup会自动创建一个以日期命名的文件夹,将所有的数据库文件复制过来,并生成日志文件,配置文件。
[root@db01 backup]# ll total 2032 drwxr-x--- 9 root root 4096 Aug 17 09:07 2019-08-17_09-07-47 [root@db01 backup]# ll 2019-08-17_09-07-47 total 63536 -rw-r----- 1 root root 431 Aug 17 09:07 backup-my.cnf drwxr-x--- 2 root root 4096 Aug 17 09:07 fxw drwxr-x--- 2 root root 4096 Aug 17 09:07 fxw1 -rw-r----- 1 root root 12582912 Aug 17 09:07 ibdata1 -rw-r----- 1 root root 52428800 Aug 17 09:07 ibdata2 drwxr-x--- 2 root root 4096 Aug 17 09:07 mysql drwxr-x--- 2 root root 4096 Aug 17 09:07 performance_schema drwxr-x--- 2 root root 4096 Aug 17 09:07 table01 drwxr-x--- 2 root root 4096 Aug 17 09:07 test drwxr-x--- 2 root root 4096 Aug 17 09:07 world -rw-r----- 1 root root 21 Aug 17 09:07 xtrabackup_binlog_info -rw-r----- 1 root root 113 Aug 17 09:07 xtrabackup_checkpoints -rw-r----- 1 root root 517 Aug 17 09:07 xtrabackup_info -rw-r----- 1 root root 2560 Aug 17 09:07 xtrabackup_logfile [root@db01 backup]#
恢复数据库
-
恢复数据前的准备(合并xtabackup_log_file和备份的物理文件)
# --apply-log 将备份中的redo和undo,恢复到数据库中,务必加上该参数innobackupex --apply-log --use-memory=32M /data/mysql/backup/2019-08-17_09-07-47
# --use-memory 为恢复程序分配内存,避免占用系统过多内存,消耗大量资源 - 模拟故障
停止数据库服务器pkill mysqld
破坏数据
[root@db01 backup]# cd /application/mysql/data/ [root@db01 data]# ll total 162144 -rw-rw---- 1 mysql mysql 56 Aug 2 12:08 auto.cnf drwxr-xr-x 2 mysql mysql 4096 Aug 17 08:58 binlog -rw-rw---- 1 mysql mysql 69869 Aug 14 16:11 db01.err drwx------ 2 mysql mysql 4096 Aug 15 11:35 fxw drwx------ 2 mysql mysql 4096 Aug 5 09:35 fxw1 -rw-rw---- 1 mysql mysql 12582912 Aug 17 09:31 ibdata1 -rw-rw---- 1 mysql mysql 52428800 Aug 17 09:31 ibdata2 -rw-rw---- 1 mysql mysql 50331648 Aug 17 09:31 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 Aug 2 12:06 ib_logfile1 drwx------ 2 mysql mysql 4096 Aug 15 11:35 mysql drwx------ 2 mysql mysql 4096 Aug 2 12:06 performance_schema -rw-rw---- 1 mysql mysql 235988 Aug 17 08:58 slow.log drwx------ 2 mysql mysql 4096 Aug 15 11:35 table01 drwxr-xr-x 2 mysql mysql 4096 Aug 2 12:04 test drwx------ 2 mysql mysql 4096 Aug 15 11:35 world [root@db01 data]# \rm -rf ./* [root@db01 data]# ll total 0 [root@db01 data]#
-
恢复数据
cp -a /data/mysql/backup/2019-08-17_09-07-47/ /application/mysql/data 或者 innobackupex --copy-back /data/mysql/backup/2019-08-17_09-07-47/
注意:恢复时,要确认数据路径是空的,并且数据库是停掉的,同样需要在第一个参数加上--defaults-file=/application/mysql/my.cnf,否则将会把参数恢复到它默认的地方
[root@db01 data]# innobackupex --defaults-file=/application/mysql/my.cnf --copy-back /data/mysql/backup/2019-08-17_09-07-47/ 190817 09:36:56 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully. At the end of a successful copy-back run innobackupex prints "completed OK!". innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2) 190817 09:41:28 [01] Copying ib_logfile0 to /application/mysql/data/ib_logfile0 190817 09:41:30 [01] ...done 190817 09:41:30 [01] Copying ib_logfile1 to /application/mysql/data/ib_logfile1 190817 09:41:32 [01] ...done . . 省略部分 . . 190817 09:37:03 [01] ...done 190817 09:41:37 [01] Copying ./table01/t1.ibd to /application/mysql/data/table01/t1.ibd 190817 09:41:37 [01] ...done 190817 09:41:37 [01] Copying ./table01/db.opt to /application/mysql/data/table01/db.opt 190817 09:41:37 [01] ...done 190817 09:41:37 [01] Copying ./test/db.opt to /application/mysql/data/test/db.opt 190817 09:41:37 [01] ...done 190817 09:41:37 completed OK! [root@db01 data]#
-
修改权限,此时并不是把数据恢复就可以启动数据库正常使用了。
[root@db01 data]# ll total 174116 drwxr-x--- 2 root root 4096 Aug 17 09:41 fxw drwxr-x--- 2 root root 4096 Aug 17 09:41 fxw1 -rw-r----- 1 root root 12582912 Aug 17 09:41 ibdata1 -rw-r----- 1 root root 52428800 Aug 17 09:41 ibdata2 -rw-r----- 1 root root 50331648 Aug 17 09:41 ib_logfile0 -rw-r----- 1 root root 50331648 Aug 17 09:41 ib_logfile1 -rw-r----- 1 root root 12582912 Aug 17 09:41 ibtmp1 drwxr-x--- 2 root root 4096 Aug 17 09:41 mysql drwxr-x--- 2 root root 4096 Aug 17 09:41 performance_schema drwxr-x--- 2 root root 4096 Aug 17 09:41 table01 drwxr-x--- 2 root root 4096 Aug 17 09:41 test drwxr-x--- 2 root root 4096 Aug 17 09:41 world -rw-r----- 1 root root 22 Aug 17 09:41 xtrabackup_binlog_pos_innodb -rw-r----- 1 root root 517 Aug 17 09:41 xtrabackup_info [root@db01 data]# chown -R mysql.mysql /application/mysql/data/
-
启动数据库,咦。。。。报错了
[root@db01 data]# service mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/application/mysql/data/db01.pid). [root@db01 data]# ps -ef|grep mysql root 2685 1246 0 09:46 pts/0 00:00:00 grep --color=auto mysql
完全在意料之外呀,查找日志,发现原来是data目录中的binlog也被我删掉了,但它又不属于数据文件,所以没有备份到,所以报错。
[root@db01 data]# cat /var/log/mysqld.log 2019-08-17 09:31:18 1706 [Note] /application/mysql/bin/mysqld: Shutdown complete /application/mysql/bin/mysqld: File '/application/mysql/data/binlog/mysql-bin.index' not found (Errcode: 2 - No such file or directory) 2019-08-17 09:44:23 2257 [ERROR] Aborting 2019-08-17 09:44:23 2257 [Note] Binlog end 2019-08-17 09:44:23 2257 [Note] /application/mysql/bin/mysqld: Shutdown complete /application/mysql/bin/mysqld: File '/application/mysql/data/binlog/mysql-bin.index' not found (Errcode: 2 - No such file or directory) 2019-08-17 09:46:03 2680 [ERROR] Aborting 2019-08-17 09:46:03 2680 [Note] Binlog end 2019-08-17 09:46:03 2680 [Note] /application/mysql/bin/mysqld: Shutdown complete
在/application/mysql/data/创建binlog日志文件夹,设置权限,重启服务。
[root@db01 data]# mkdir binlog [root@db01 data]# chown -R mysql.mysql binlog [root@db01 data]# service mysqld start Starting MySQL. SUCCESS! [root@db01 data]# ll
# 所以建议不要把日志文件放在data目录下。
-
测试数据库
[root@db01 data]# mysql -uroot -p123456 -e "select * from world.city where id < 10" Warning: Using a password on the command line interface can be insecure. +----+----------------+-------------+---------------+------------+ | ID | Name | CountryCode | District | Population | +----+----------------+-------------+---------------+------------+ | 1 | Kabul | AFG | Kabol | 1780000 | | 2 | Qandahar | AFG | Qandahar | 237500 | | 3 | Herat | AFG | Herat | 186800 | | 4 | Mazar-e-Sharif | AFG | Balkh | 127800 | | 5 | Amsterdam | NLD | Noord-Holland | 731200 | | 6 | Rotterdam | NLD | Zuid-Holland | 593321 | | 7 | Haag | NLD | Zuid-Holland | 440900 | | 8 | Utrecht | NLD | Utrecht | 234323 | | 9 | Eindhoven | NLD | Noord-Brabant | 201843 | +----+----------------+-------------+---------------+------------+
搞定!!!!!!!!!!!!!
上一章是针对逻辑删库跑路的,这一章就是针对物理删库跑路的了,啊哈哈哈

