########################################################################
### 安装mysql或者mariaDB本地也要装mysql或者mariaDB相关的包 ##
########################################################################
略
#######################################
## xtrabackup 的安装 ###
#######################################
[[email protected] ~]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm # 安装指定的yum源
[[email protected] ~]# yum -y install percona-xtrabackup.x86_64 # 安装软件
#######################################
## 全量备份服务器的mysql数据 ###
#######################################
1)创建当天备份数据保存的路径
[[email protected] ~]# mkdir -p /backup/mysql/full/2015-05-07
2)全量备份服务器的数据(不压缩)
[[email protected] full]# /usr/bin/innobackupex --user=root --password=123456789 --host=localhost --port=3306 --defaults-file=/etc/my.cnf /backup/mysql/full/2015-05-07/
3) 修改配置文件,增加[mysqld] 选项防止在恢复数据时报错
[[email protected] full]# vi /etc/my.cnf
[mysqld]
datadir="/var/lib/mysql"
########################################
### 全量备份数据恢复 ####
########################################
1) 停止mysql
[[email protected] full]# service mysql stop
2) 模拟数据丢失
[[email protected] ~]# mv /var/lib/mysql /var/lib/mysql_bak
Bye
3) 用上面备份的数据恢复
通过--apply-log指明将日志应用到数据文件上
[[email protected] full]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
3.1 如果数据库目录为空,可以使用--copy-back选项用于执行恢复操作。因为使用--copy-back恢复要求恢复的目录必须为空
[[email protected] full]# mv /var/lib/mysql /var/lib/mysql_old
[[email protected] full]# mkdir /var/lib/mysql
[[email protected] full]# /usr/bin/innobackupex --user=root --password=123456789 --copy-back --defaults-file=/etc/my.cnf /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
[[email protected] full]# chown -R mysql:mysql /var/lib/mysql # 修改所有者,所属组
[[email protected] full]# service mysql start # 启动mysql
[[email protected] full]# mysql -u root -p # 登录查看数据是否恢复
Enter password:
MariaDB [(none)]> show databases; # 发现数据已经恢复
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test_db |
+--------------------+
3.2 如果数据库目录不为空,使用直接copy的方法恢复数据(不常用)
rm -f /var/lib/mysql/ibdata/ib* # 如果innodb数据文件放在单独的目录,需要单独删除。 我这里不是单独放置的
[[email protected] full]# rm -f /var/lib/mysql/ib* # 删除innodb数据文件 # 如果是恢复MyISAM引擎的数据表则没必要执行这一步
[[email protected] full]# rm -rf /var/lib/mysql/test_db # 删除指定的数据库test_db
# 恢复
[[email protected] full]# cp -r /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/test_db /var/lib/mysql/
[[email protected] full]# cp -r /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ib* /var/lib/mysql/ # 如果innodb数据文件放在单独的目录,需要单独复制
[[email protected] full]# chown -R mysql:mysql /var/lib/mysql # 修改所有者,所属组
[[email protected] full]# service mysql start
[[email protected] full]# mysql -u root -p123456789 # 登录数据库查看数据已经恢复
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test_db |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> use test_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [test_db]> select * from test_table1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
| 5 | guqi |
+------+----------+
5 rows in set (0.00 sec) # 数据已经恢复
##############################################
### 增量备份 ##
##############################################
1)开启二进制日志
[[email protected] ~]# vi /etc/my.cnf
[mysqld]
datadir="/var/lib/mysql"
log-bin=/data/mysql/log/mysql-bin
[[email protected] ~]# service mysql restart
2)增量备份是建立在全量备份的基础上的所以先确保有一次全量备份,全量备份前面已经介绍
3) 我们往数据库中添加数据,进行第一次增量备份
MariaDB [test_db]> insert into test_table1 values(6,‘xiaoming‘);
Query OK, 1 row affected (0.00 sec)
MariaDB [test_db]> select * from test_table1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
| 5 | guqi |
| 6 | xiaoming |
+------+----------+
6 rows in set (0.00 sec)
[[email protected] ~]# mkdir -p /backup/mysql/increment/2015-05-07 # 创建增量备份保存的路径
4) 进行第一次增量备份
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ # 第一次增量备份 (如果是mariadb不添加--incremental-force-scan参数可能会因为不支持FLUSH CHANGED_PAGE_BITMAPS而报错导致增量备份失败)
第一次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/
5) 再次往数据表中插入内容
MariaDB [test_db]> insert into test_table1 values(7,‘xiaohong‘);
Query OK, 1 row affected (0.05 sec)
6)进行第二次增量备份
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/
第二次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/
7)查看最后一次增量备份时所对应的二进制日志及位置
[[email protected] ~]# cat /backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/xtrabackup_binlog_info
mysql-bin.000001 833 0-1-3
MariaDB [(none)]> show master status
-> ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 833 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec) # 可以看到如果没有在增量备份后再对数据库进行增删改操作。则从增量备份中得出的信息和从二进制日志中看到的是一样的。
###################################################################
### 增量备份数据还原 ###
###################################################################
恢复增量备份
增量备份的还原操作跟完整的还原有点不一样,首先必须使用--apply-log --redo-only对完整备份的目录及所有增量备份目录进行操作,然后就可以像还原完整备份时的操作了。(apply increment log to full data)
1 模拟数据丢失
[[email protected] ~]# service mysql stop
[[email protected] ~]# rm -rf /var/lib/mysql
[[email protected] ~]# mkdir /var/lib/mysql
2 通过--apply-log --redo-only指明将日志应用到数据文件上
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
3 把第一次增量备份的数据应用到全量备份上
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/
4 把第二次增量备份的数据应用到全量备份上
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/
5 恢复数据(这里和全量备份的恢复相同了)
[[email protected] ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --copy-back /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
6 更改权限,启动服务,登录mysql,查看数据是否恢复
[[email protected] ~]# chown -R mysql:mysql /var/lib/mysql
[[email protected] ~]# service mysql start
MariaDB [test_db]> select * from test_table1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
| 5 | guqi |
| 6 | xiaoming |
| 7 | xiaohong |
+------+----------+
7 rows in set (0.00 sec) # 数据已经恢复