一、MySQL增量恢复必备条件。
思路迁移-可以通过sersync做异地脚本备份后的内容,放置linux本机机器故障。
(1)检查MySQL运行是否正常
[root@sersync 3307]# netstat -tlnp | grep mysql
tcp 0 0 :::3307 :::* LISTEN 5675/mysqld
tcp 0 0 :::3308 :::* LISTEN 3376/mysqld
tcp 0 0 :::3306 :::* LISTEN 4579/mysqld
[root@sersync 3307]# mkdir /server/backup -p 创建备份目录
(2)开启MySQL log bin 日志功能
MySQL 数据库开启了log bin 参数记录bin log日志功能如下:
[root@sersync 3307]# grep log_bin /data/3307/my.cnf
log_bin = /data/3307/mysql-bin
[root@sersync 3307]#
重启mysql检查发现确实多出了mysql-bin.000001,mysql-bin.index
[root@sersync 3307]# ls
data mysql mysql-bin.index mysql.sock
my.cnf mysql-bin.000001 mysqld.pid mysql_tangbo3307.err
[root@sersync 3307]#
(3)需要存在MySQL 数据库全备
生产环境mysqldump备份命令
[root@sersync backup]# mysqldump -uroot -p111111 -S /data/3307/mysql.sock --single-transaction -B caiwu | gzip > /server/backup/bbpay_caiwu_$(date +%F).sql.gz
(4)生产环境mysqldunmp备份脚本
#!/bin/sh
################################################
#this scripts is created by tangbo
#tangbo QQ:79313760
################################################
#parameter defined start
BAKDATE=`date +%F`
MYUSER=root
MYPASS="111111"
MYSOCK=/data/3307/mysql.sock
DBNAME="caiwu"
MAIN_PATH=/server/backup
DATA_PATH=/server/backup
LOG_FILE=${DATA_PATH}/mysql_logs_${BAKDATE}.log
DATA_FILE=${DATA_PATH}/mysql_backup_${BAKDATE}.sql.gz
#command defined
MYSQL_PATH=/usr/local/mysql/bin
#MYSQL_DUMP="$MYSQL_PATH/mysqldump -u$MYUSER -p$MYPASS -S $MYSOCK -A -B -F --single-transaction -e"
MYSQL_DUMP="$MYSQL_PATH/mysqldump -u$MYUSER -p$MYPASS -S $MYSOCK -F -B $DBNAME --default-character-set=gbk --single-transaction -e"
#backup command
${MYSQL_DUMP} | gzip > $DATA_FILE
#check backup result
du -sh $DATA_FILE >$LOG_FILE
mail -s "${BAKDATE} mysql bak log" [email protected] < $LOG_FILE
##################end##########################
二、MySQL增量恢复案例图解
--见图片--
三、恢复数据库场景
(1)创建数据库;
mysql> create database caiwu CHARACTER SET utf8 COLLATE utf8_general_ci;
(2)创建utf8格式表
set names utf8;
CREATE TABLE `caiwus` (
`id` int(30) NOT NULL AUTO_INCREMENT COMMENT '员工号',
`name` varchar(60) NOT NULL COMMENT '员工名字',
`ages` varchar(60) DEFAULT NULL COMMENT '员工年龄',
`job` varchar(30) DEFAULT NULL COMMENT '工作岗位',
`pay` float DEFAULT NULL COMMENT '薪金',
`time` date DEFAULT NULL COMMENT '入职时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
(3)向caiwus表中插入数据
insert into caiwus(name,ages,job,pay,time) values('唐波',27,'网络管理',4000,20140930);
insert into caiwus(name,ages,job,pay,time) values('王非',32,'技术工程师',6000,20150110);
insert into caiwus(name,ages,job,pay,time) values('汪波',37,'DBA',8000,20130320);
insert into caiwus(name,ages,job,pay,time) values('陈思思',24,'行政管理',3500,20150112);
insert into caiwus(name,ages,job,pay,time) values('刘玉',27,'财务',4330,20152010);
insert into caiwus(name,ages,job,pay,time) values('谢红',28,'销售工程师',3000,20130930);
insert into caiwus(name,ages,job,pay,time) values('陈税',27,'销售管理',4000,20140930);
insert into caiwus(name,ages,job,pay,time) values('唐思',27,'销售管理',4100,20140930);
insert into caiwus(name,ages,job,pay,time) values('陈杨',27,'销售管理',4700,20140930);
(4)定时任务数据库备份脚本---用前面的生产环境mysqldunmp备份脚本(生产用脚本)
[root@sersync backup]# chmod +x mysqlbak.sh
[root@sersync backup]# crontab -l
#mysql backup by tangbo on 2015-12-22
00 00 * * * /bin/bash /server/backup/mysqlbak.sh >/dev/null 2>&1
*/1 * * * * /usr/sbin/ntpdate time.nist.gov &> /dev/null 2>&1
[root@sersync backup]#
(5)由于是测试手工模拟执行备份脚本
[root@sersync backup]# sh mysqlbak.sh
[root@sersync backup]# ll 一定要检查备份的大小
total 16
-rw-r--r-- 1 root root 2718 Dec 31 2015 bbpay_caiwu_2015-12-31.sql
-rw-r--r-- 1 root root 1101 Dec 31 13:46 mysql_backup_2015-12-31.sql.gz
-rwxr-xr-x 1 root root 925 Dec 31 13:46 mysqlbak.sh
-rw-r--r-- 1 root root 51 Dec 31 13:46 mysql_logs_2015-12-31.log
[root@sersync backup]#egrep -v "#|\*|--|^$" bbpay_caiwu_2015-12-31.sql
[root@sersync home]# gzip -d mysql_backup_2015-12-31.sql.gz 解压
[root@sersync home]# ls 查看内容
lost+found my.cnf mysql mysql_backup_2015-12-31.sql
[root@sersync home]# vim mysql_backup_2015-12-31.sql
(6)备份后检查bin-log日志,明显增加了。bin log日志一般是加1,超高1.1G会滚动增加。
[root@sersync backup]# ll /data/3307/
total 64
drwxr-xr-x 5 mysql mysql 4096 Dec 31 2015 data
-rw-r--r-- 1 root root 2688 Dec 31 2015 my.cnf
-rwxr-xr-x 1 root root 1118 Dec 29 18:14 mysql
-rw-rw---- 1 mysql mysql 10977 Dec 31 13:51 mysql-bin.000001
-rw-rw---- 1 mysql mysql 120 Dec 31 13:51 mysql-bin.000002
-rw-rw---- 1 mysql mysql 56 Dec 31 13:51 mysql-bin.index
-rw-rw---- 1 mysql mysql 5 Dec 31 2015 mysqld.pid
srwxrwxrwx 1 mysql mysql 0 Dec 31 2015 mysql.sock
-rw-r----- 1 mysql root 24277 Dec 31 2015 mysql_tangbo3307.err
[root@sersync backup]#
(7)模拟用户继续更新数据
我们在0点时刻进行备份之后,用户还是会时刻更新数据的;这儿模拟实时更新数据。
insert into caiwus(name,ages,job,pay,time) values('王鹏',29,'技术工程师',5500,20130212);
insert into caiwus(name,ages,job,pay,time) values('张杰',27,'开发工程师',8800,20130210);
insert into caiwus(name,ages,job,pay,time) values('葛林',26,'行政管理',3300,20150322);
insert into caiwus(name,ages,job,pay,time) values('谢玲',32,'销售管理',3200,20130620);
insert into caiwus(name,ages,job,pay,time) values('吴彩虹',22,'销售管理',2200,20150127);
insert into caiwus(name,ages,job,pay,time) values('王杰',29,'销售经理',4350,20140828);
insert into caiwus(name,ages,job,pay,time) values('陈坤',33,'销售管理',3300,20140930);
insert into caiwus(name,ages,job,pay,time) values('谢思',45,'总裁',12000,20110930);
(8)更新后的内容
mysql> select * from caiwus;
+----+-----------+------+-----------------+-------+------------+
| id | name | ages | job | pay | time |
+----+-----------+------+-----------------+-------+------------+
| 1 | 唐波 | 27 | 网络管理 | 4000 | 2014-09-30 |
| 2 | 王非 | 32 | 技术工程师 | 6000 | 2015-01-10 |
| 3 | 汪波 | 37 | DBA | 8000 | 2013-03-20 |
| 4 | 陈思思 | 24 | 行政管理 | 3500 | 2015-01-12 |
| 5 | 刘玉 | 27 | 财务 | 430 | 0000-00-00 |
| 6 | 谢红 | 28 | 销售工程师 | 3000 | 2013-09-30 |
| 7 | 陈税 | 27 | 销售管理 | 4000 | 2014-09-30 |
| 8 | 唐思 | 27 | 销售管理 | 4100 | 2014-09-30 |
| 9 | 陈杨 | 27 | 销售管理 | 4700 | 2014-09-30 |
| 10 | 王鹏 | 29 | 技术工程师 | 5500 | 2013-02-12 |
| 11 | 张杰 | 27 | 开发工程师 | 8800 | 2013-02-10 |
| 12 | 葛林 | 26 | 行政管理 | 3300 | 2015-03-22 |
| 13 | 谢玲 | 32 | 销售管理 | 3200 | 2013-06-20 |
| 14 | 吴彩虹 | 22 | 销售管理 | 2200 | 2015-01-27 |
| 15 | 王杰 | 29 | 销售经理 | 4350 | 2014-08-28 |
| 16 | 陈坤 | 33 | 销售管理 | 3300 | 2014-09-30 |
| 17 | 谢思 | 45 | 总裁 | 12000 | 2011-09-30 |
+----+-----------+------+-----------------+-------+------------+
17 rows in set (0.00 sec)
四、模拟数据库遭到破坏
(1)执行删除数据库命令
mysql> drop database caiwu;
Query OK, 1 row affected (0.13 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql> 财务表不在了!!!!!!
(2)发现故障并且检查原因
数据库出问题10分钟左右,公司上报故障,要求解决,查看原因,准备恢复。
五、###############增量恢复全过程#####################
(1)首先检查全备及binlog日志
查看凌晨全备
[root@sersync backup]# ll /server/backup/
total 12
-rw-r--r-- 1 root root 1101 Dec 31 13:51 mysql_backup_2015-12-31.sql.gz
-rwxr-xr-x 1 root root 927 Dec 31 13:51 mysqlbak.sh
-rw-r--r-- 1 root root 51 Dec 31 13:51 mysql_logs_2015-12-31.log
[root@sersync backup]#
查看所有binlog
[root@sersync backup]# ls -lrt /data/3307/mysql-bin.*
-rw-rw---- 1 mysql mysql 10977 Dec 31 13:51 /data/3307/mysql-bin.000001
-rw-rw---- 1 mysql mysql 56 Dec 31 13:51 /data/3307/mysql-bin.index
-rw-rw---- 1 mysql mysql 2707 Dec 31 14:29 /data/3307/mysql-bin.000002
[root@sersync backup]#
(2)立即刷新并备份出binlog
[root@sersync backup]# mysqladmin -uroot -p111111 -S /data/3307/mysql.sock flush-logs 刷新binlog
[root@sersync backup]# ls -lrt /data/3307/mysql-bin.* 查看binlog刷新情况
-rw-rw---- 1 mysql mysql 10977 Dec 31 13:51 /data/3307/mysql-bin.000001
-rw-rw---- 1 mysql mysql 2754 Dec 31 14:37 /data/3307/mysql-bin.000002
-rw-rw---- 1 mysql mysql 120 Dec 31 14:37 /data/3307/mysql-bin.000003
-rw-rw---- 1 mysql mysql 84 Dec 31 14:37 /data/3307/mysql-bin.index
[root@sersync backup]#
[root@sersync backup]# cp /data/3307/mysql-bin.000003 /server/backup 复制到备份目录
(3)恢复binlog生成sql语句
[root@sersync backup]# mysqlbinlog mysql-bin.000003 >bin.sql
[root@sersync backup]#egrep -v "#|\*|--|^$" bin.sql 检查生成的语句(注意,把错误的语句注释掉)
[root@sersync backup]# vim bin.sql 打开它,注释掉不要的语句
##(4)##开始恢复
1.首先恢复全备那一块的内容,检查全备后,恢复增量的内容
[root@sersync backup]# ls -l mysql_backup_2015-12-31.sql.gz
-rw-r--r-- 1 root root 1101 Dec 31 13:51 mysql_backup_2015-12-31.sql.gz
[root@sersync backup]# gzip -d mysql_backup_2015-12-31.sql.gz 解压
2.查看全备内容,确认内容是否在
[root@sersync backup]# egrep -v "#|\*|--|^$" mysql_backup_2015-12-31.sql
USE `caiwu`;
DROP TABLE IF EXISTS `caiwus`;
CREATE TABLE `caiwus` (
`id` int(30) NOT NULL AUTO_INCREMENT COMMENT '员工号',
`name` varchar(60) NOT NULL COMMENT '员工名字',
`ages` varchar(60) DEFAULT NULL COMMENT '员工年龄',
`job` varchar(30) DEFAULT NULL COMMENT '工作岗位',
`pay` float DEFAULT NULL COMMENT '薪金',
`time` date DEFAULT NULL COMMENT '入职时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
LOCK TABLES `caiwus` WRITE;
INSERT INTO `caiwus` VALUES (1,'?2¨','27','θ?1??4000,'2014-09-30'),(2,'ε・?,'32','???1¤3?|',6000,'2015-01-10'),(3,'δ2¨','37','DBA',8000,'2013-03-20'),(4,'3???','24','??1??3500,'2015-01-12'),(5,'μ?','27','2ǎ�30,'0000-00-00'),(6,'лo?'28','к?1¤3?|',3000,'2013-09-30'),(7,'3?°','27','к?1??4000,'2014-09-30'),(8,'??','27','к?1??4100,'2014-09-30'),(9,'3??'27','к?1??4700,'2014-09-30');
UNLOCK TABLES;
[root@sersync backup]#
3.内容都在,开始恢复全备内容。
[root@sersync backup]# mysql -uroot -p111111 -S /data/3307/mysql.sock < mysql_backup_2015-12-31.sql
检查恢复结果:
全备数据回来了:
mysql> select * from caiwus;
+----+-----------+------+-----------------+------+------------+
| id | name | ages | job | pay | time |
+----+-----------+------+-----------------+------+------------+
| 1 | 唐波 | 27 | 网络管理 | 4000 | 2014-09-30 |
| 2 | 王非 | 32 | 技术工程师 | 6000 | 2015-01-10 |
| 3 | 汪波 | 37 | DBA | 8000 | 2013-03-20 |
| 4 | 陈思思 | 24 | 行政管理 | 3500 | 2015-01-12 |
| 5 | 刘玉 | 27 | 财务 | 430 | 0000-00-00 |
| 6 | 谢红 | 28 | 销售工程师 | 3000 | 2013-09-30 |
| 7 | 陈税 | 27 | 销售管理 | 4000 | 2014-09-30 |
| 8 | 唐思 | 27 | 销售管理 | 4100 | 2014-09-30 |
| 9 | 陈杨 | 27 | 销售管理 | 4700 | 2014-09-30 |
+----+-----------+------+-----------------+------+------------+
9 rows in set (0.00 sec)
mysql>
4.恢复增量数据
[root@sersync backup]# mysql -uroot -p111111 -S /data/3307/mysql.sock < bin.sql
检查恢复结果:
全备数据回来了:
mysql> select * from caiwu.caiwus;
+----+-----------+------+-----------------+-------+------------+
| id | name | ages | job | pay | time |
+----+-----------+------+-----------------+-------+------------+
| 1 | 唐波 | 27 | 网络管理 | 4000 | 2014-09-30 |
| 2 | 王非 | 32 | 技术工程师 | 6000 | 2015-01-10 |
| 3 | 汪波 | 37 | DBA | 8000 | 2013-03-20 |
| 4 | 陈思思 | 24 | 行政管理 | 3500 | 2015-01-12 |
| 5 | 刘玉 | 27 | 财务 | 430 | 0000-00-00 |
| 6 | 谢红 | 28 | 销售工程师 | 3000 | 2013-09-30 |
| 7 | 陈税 | 27 | 销售管理 | 4000 | 2014-09-30 |
| 8 | 唐思 | 27 | 销售管理 | 4100 | 2014-09-30 |
| 9 | 陈杨 | 27 | 销售管理 | 4700 | 2014-09-30 |
| 10 | 王鹏 | 29 | 技术工程师 | 5500 | 2013-02-12 |
| 11 | 张杰 | 27 | 开发工程师 | 8800 | 2013-02-10 |
| 12 | 葛林 | 26 | 行政管理 | 3300 | 2015-03-22 |
| 13 | 谢玲 | 32 | 销售管理 | 3200 | 2013-06-20 |
| 14 | 吴彩虹 | 22 | 销售管理 | 2200 | 2015-01-27 |
| 15 | 王杰 | 29 | 销售经理 | 4350 | 2014-08-28 |
| 16 | 陈坤 | 33 | 销售管理 | 3300 | 2014-09-30 |
| 17 | 谢思 | 45 | 总裁 | 12000 | 2011-09-30 |
+----+-----------+------+-----------------+-------+------------+
17 rows in set (0.00 sec)
mysql>
5.成功 数据全部回来了!!!!!!!!
本文出自 “山猫” 博客,谢绝转载!