一、用xtrabackup实现mysql数据的备份
1、简介
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:
备份过程快速、可靠;
备份过程不会打断正在执行的事务;
能够基于压缩等功能节约磁盘空间和流量;
自动实现备份检验;
还原速度快;
2、下载xtrabackup
连接地址:https://www.percona.com/downloads/XtraBackup/
3、安装xtrabackup
[root@example.com ~]# yum install -y percona-xtrabackup-2.2.12-1.el6.x86_64.rpm
查看安装包生成的文件:
[root@example.com ~]# rpm -ql percona-xtrabackup-2.2.12-1.el6.x86_64 /usr/bin/innobackupex /usr/bin/xbcrypt /usr/bin/xbstream /usr/bin/xtrabackup /usr/share/doc/percona-xtrabackup-2.2.12 /usr/share/doc/percona-xtrabackup-2.2.12/COPYING /usr/share/man/man1/innobackupex.1.gz /usr/share/man/man1/xbcrypt.1.gz /usr/share/man/man1/xbstream.1.gz /usr/share/man/man1/xtrabackup.1.gz
3、备份文件意义及常用选项意义
语法:# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
/path/to/BACKUP-DIR/文件为xtrabackup的备份文件,在备份的同时,innobackupex还会在备份目录中创建如下文件:
xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息; 每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
backup-my.cnf —— 备份命令用到的配置选项信息;
说明:在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
常用选项:
--defaults-file #数据库的配置文件路径,感觉本地备份不写也可以,远程没测试过。
--apply-log #准备在一个备份上启动mysql服务。
--copy-back #从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置。
--no-timestamp #创建备份时不自动生成时间目录,可以自定义备份目录名例如: /backups/mysql/base
--databases #用于指定要备份的数据库, 多个库文件使用方法: “database1 database2″
--incremental #在全备份的基础上进行增量备份,后跟增量备份存贮目录路径
--incremental-basedir=DIRECTORY #增量备份所需要的全备份路径目录或上次做增量备份的目录路径
--incremental-dir=DIRECTORY #增量备份存贮的目录路径
--redo-only #用于准备增量备份内容把数据合并到全备份目录,配合–incremental-dir 增量备份目录使用。
--force-non-empty-directories #如果是特定库备份还原,不需要删掉整个mysql目录,只是特定库的及相关文件就可以,还原时加上此参数就不会报错。
4、准备一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
如果执行正确,其最后输出的行信息通常如下:
150122 21:45:20 innobackupex: completed OK!
在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。
5、基于备份文件进行恢复
注意:试验前最好将自己的mysql的二进制文件和数据文件放在分开的俩目录中,举例如何配置my.cnf文件这里就不做介绍了。下面的例子的数据都是基于InnoDB引擎存储的,这点要注意。
创建备份数据存放目录:
[root@example.com ~]# mkdir /backup/
完全备份数据库:
[root@example.com ~]# innobackupex --user=root --password=redhat /backup/
查看备份后所生成的文件:
[root@example.com ~]# ls /backup/2015-09-01_13-20-38/ backup-my.cnf mysql xtrabackup_binlog_info xtrabackup_logfile hellodb performance_schema xtrabackup_checkpoints ibdata1 test xtrabackup_info
手动删除数据文件:
[root@example.com ~]# /etc/init.d/mysqld stopShutting down MySQL.. SUCCESS! [root@example.com ~]# rm -rf /data/mydata/*
恢复数据:
[root@example.com ~]# innobackupex --apply-log /backup/2015-09-01_13-20-38/ [root@example.com ~]# innobackupex --copy-back /backup/2015-09-01_13-20-38/
查看数据是否恢复,并更改数据目录的属主和属组:
[root@example.com ~]# cd /data/mydata/ [root@example.com mydata]# ls hellodb ib_logfile1 test ibdata1 mysql xtrabackup_binlog_pos_innodb ib_logfile0 performance_schema xtrabackup_info [root@example.com mydata]# chown -R mysql.mysql /data/mydata/
登录到mysql上看到数据以恢复:
MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) MariaDB [(none)]> use hellodb Database changed MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | teachers | | toc | +-------------------+ 7 rows in set (0.00 sec)
恢复数据后记得做次完整备份:
[root@example.com ~]# innobackupex --user=root --password=redhat /backup/ [root@example.com ~]# ls /backup/2015-09-01_13-33-07/ backup-my.cnf mysql xtrabackup_binlog_info xtrabackup_logfile hellodb performance_schema xtrabackup_checkpoints ibdata1 test xtrabackup_info
6、结合备份文件和二进制文件进行数据恢复
由于前面已经做过一次完整备份这里就不在做完整备份了,下面先更新数据在对数据库做增量备份,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。:
MariaDB [hellodb]> CREATE TABLE tt(name CHAR(30)); Query OK, 0 rows affected (0.23 sec) MariaDB [hellodb]> INSERT INTO tt VALUES(‘bols‘),(‘longls‘); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
增量备份后查看增量备份的lsn值能否和上传完全备份的lsn值对上:
[root@example.com ~]# innobackupex --user=root --password=redhat --incremental /backup/ --incremental-basedir=/backup/2015-09-01_13-33-07/ [root@example.com 2015-09-01_13-40-39]# cat xtrabackup_checkpoints backup_type = incremental from_lsn = 1957642 to_lsn = 1963343 last_lsn = 1963343 compact = 0 [root@example.com 2015-09-01_13-40-39]# cat ../2015-09-01_13-33-07/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 1957642 last_lsn = 1957642 compact = 0
在次更新数据:
MariaDB [(none)]> use hellodb Database changed MariaDB [hellodb]> INSERT INTO tt VALUES(‘xiaozels‘),(‘cangls‘); Query OK, 2 rows affected (0.04 sec) Records: 2 Duplicates: 0 Warnings: 0
做二次增量备份:
[root@example.com ~]# innobackupex --user=root --password=redhat --incremental /backup/ --incremental-basedir=/backup/2015-09-01_13-40-39/ [root@example.com 2015-09-01_13-40-39]# cat xtrabackup_checkpoints backup_type = incremental from_lsn = 1957642 to_lsn = 1963343 last_lsn = 1963343 compact = 0 [root@example.com 2015-09-01_13-40-39]# cat ../2015-09-01_13-47-00/xtrabackup_checkpoints backup_type = incremental from_lsn = 1963343 to_lsn = 1965182 last_lsn = 1965182 compact = 0
在次更新数据:
MariaDB [hellodb]> INSERT INTO tt VALUES(‘tianls‘),(‘jizels‘); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0
手动执行删除数据:
[root@example.com ~]# service mysqld stop Shutting down MySQL.. SUCCESS! [root@example.com ~]# rm -rf /data/mydata/*
基于两次的增量备份所生成的信息添加至最近一次的完整备份文件中:
[root@example.com ~]# innobackupex --user=root --password=redhat --apply-log --redo-only /backup/2015-09-01_13-33-07/ [root@example.com ~]# innobackupex --user=root --password=redhat --apply-log --redo-only /backup/2015-09-01_13-33-07/ --incremental-dir=/backup/2015-09-01_13-40-39/ [root@example.com ~]# innobackupex --user=root --password=redhat --apply-log --redo-only /backup/2015-09-01_13-33-07/ --incremental-dir=/backup/2015-09-01_13-47-00/
查看完整备份的文件是否将上两次的增量备份的内容整合进去:
[root@example.com ~]# cd /backup/2015-09-01_13-33-07/ [root@example.com 2015-09-01_13-33-07]# cat xtrabackup_checkpoints backup_type = log-applied from_lsn = 0 to_lsn = 1965182 last_lsn = 1965182 compact = 0 [root@example.com 2015-09-01_13-33-07]# cat ../2015-09-01_13-47-00/xtrabackup_checkpoints backup_type = incremental from_lsn = 1963343 to_lsn = 1965182 last_lsn = 1965182 compact = 0
查看所生成的完整备份文件所记录的二进制文件信息是否和最后一次执行增量备份的二进制日志信息一致:
[root@example.com 2015-09-01_13-33-07]# cat xtrabackup_binlog_info master-bin.0000068070-1-93 [root@example.com 2015-09-01_13-33-07]# cat ../2015-09-01_13-47-00/xtrabackup_binlog_info master-bin.000006 807 0-1-93
执行恢复数据操作:
[root@example.com ~]# innobackupex --user=root --password=redhat --copy-back /backup/2015-09-01_13-33-07/
查看数据是否恢复:
[root@example.com ~]# ls /data/mydata/ hellodb ibdata1 mysql performance_schema test xtrabackup_info [root@example.com ~]# chown -R mysql.mysql /data/mydata/
将最近一次增量备份的数据位置之后二进制日志所记录的信息输出然后用来恢复数据:
[root@example.com ~]# mysqlbinlog --start-position=807 /data/binlog/master-bin.000006 > /tmp/inc.sql [root@example.com ~]# service mysqld start
接入mysql,并执行恢复数据操作:
MariaDB [(none)]> SET SESSION sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> SOURCE /tmp/inc.sql ; Query OK, 0 rows affected (0.09 sec) MariaDB [hellodb]> SET SESSION sql_log_bin=1; Query OK, 0 rows affected (0.00 sec)
发现数据已恢复:
MariaDB [hellodb]> SELECT * FROM tt; +----------+ | name | +----------+ | bols | | longls | | xiaozels | | cangls | | tianls | | jizels | +----------+ 6 rows in set (0.00 sec)
7、关于备份数据建议
将数据和备份放在不同的磁盘设备上;异机或异地备份存储较为理想;
备份的数据应该周期性地进行还原测试;
每次灾难恢复后都应该立即做一次完全备份;
针对不同规模或级别的数据量,要定制好备份策略;
二进制日志应该跟数据文件在不同磁盘上,并周期性地备份好二进制日志文件;
8、从备份中恢复应该遵循步骤
停止MySQL服务器;
记录服务器的配置和文件权限;
将数据从备份移到MySQL数据目录;其执行方式依赖于工具;
改变配置和文件权限;
以限制访问模式重启服务器;mysqld的--skip-networking选项可跳过网络功能;
方法:编辑my.cnf配置文件,添加如下项:
skip-networking
socket=/tmp/mysql-recovery.sock
载入逻辑备份(如果有);而后检查和重放二进制日志;
检查已经还原的数据;
重新以完全访问模式重启服务器;
注释前面在my.cnf中添加的选项,并重启;
二、基于SQL语句的备份
此种备份方法用在备份表的某一行或某一字段比较好。
MariaDB [hellodb]> SELECT * FROM students WHERE Gender=‘M‘ INTO OUTFILE ‘/tmp/stu.txt‘; Query OK, 15 rows affected (0.48 sec) [root@example.com ~]# cat /tmp/stu.txt 1 Shi Zhongyu 22 M 2 3 2 Shi Potian 22 M 1 7 3 Xie Yanke 53 M 2 16 4 Ding Dian 32 M 4 4 5 Yu Yutong 26 M 3 1 6 Shi Qing 46 M 5 \N 11 Yuan Chengzhi 23 M 6 \N 13 Tian Boguang 33 M 2 \N 15 Duan Yu 19 M 4 \N 16 Xu Zhu 21 M 1 \N 17 Lin Chong 25 M 4 \N 18 Hua Rong 23 M 7 \N 23 Ma Chao 23 M 4 \N 24 Xu Xian 27 M \N \N 25 Sun Dasheng 100 M \N \N MariaDB [hellodb]> CREATE TABLE testtb LIKE students; Query OK, 0 rows affected (0.41 sec) MariaDB [hellodb]> DESC testtb; +-----------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------------+------+-----+---------+----------------+ | StuID | int(10) unsigned | NO | PRI | NULL | auto_increment | | Name | varchar(50) | NO | | NULL | | | Age | tinyint(3) unsigned | NO | | NULL | | | Gender | enum(‘F‘,‘M‘) | NO | | NULL | | | ClassID | tinyint(3) unsigned | YES | | NULL | | | TeacherID | int(10) unsigned | YES | | NULL | | +-----------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.30 sec) MariaDB [hellodb]> LOAD DATA INFILE ‘/tmp/stu.txt‘ INTO TABLE testtb; Query OK, 15 rows affected (0.23 sec) Records: 15 Deleted: 0 Skipped: 0 Warnings: 0 MariaDB [hellodb]> SELECT * FROM testtb; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 15 rows in set (0.00 sec)
本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1691433
原文地址:http://cuchadanfan.blog.51cto.com/9940284/1691433