这里先把两种方法的优缺点列出,在通过实验比较两者的性能。
mysqlbinlog方法innobackupex --user=wxy --password=123456 --port=3306 --socket=/tmp/mysql.sock /home/mysql/backup
innobackupex --apply-log /home/mysql/backup/2015-07-01_09-04-12/
2. 产生100万条数据和100个binlog文件
-- 建立测试表
create table t1 (
a int not null primary key
) engine=innodb;
-- 建立生成数据和binlog文件的存储过程
delimiter $$
create procedure pCreateNums(cnt int)
begin
declare s int default 1;
while s<=cnt do
insert into t1 values(s);
if mod(s,10000)=0 then
commit;
flush logs;
end if;
set s=s+1;
end while;
commit;
end $$
-- 执行调用存储过程
delimiter ;
call pCreateNums(1000000);
-- 查询验证
select count(*),min(a),max(a) from t1;
show binary logs;
3. 备份binlog文件
cp /usr/local/mysql/data/mysql-bin.* /home/mysql/binlog_bak
# 删除mysql-bin.index文件
rm -f /home/mysql/binlog_bak/mysql-bin.index
4. 用xtrabackup还原备份的数据库
service mysql stop
rm -rf /usr/local/mysql/data/*
innobackupex --copy-back /home/mysql/backup/2015-07-01_09-04-12/
# 启动MySQL服务
service mysql start
# 查看需要恢复的起始binlog文件名和位置
more /home/mysql/backup/2015-07-01_09-04-12/xtrabackup_binlog_info
cd /home/mysql/binlog_bak
# 在mysqlbinlog命令中应用xtrabackup_binlog_info中的文件名及其后面产生的所有binlog文件,start-position为xtrabackup_binlog_info中的pos
mysqlbinlog $(ls -l | awk '{print $9}') --start-position=120 | mysql -u wxy -p123456
-- 执行时间:4分24秒
-- 查询验证
select count(*),min(a),max(a) from t1;
# 因为缺省情况下,slave应用完relay log就会将relay log文件删除,所以先做一个额外的备份,以免失败的情况丢失binlog
# 此步骤不是必须的,但强烈建议做
cp /home/mysql/binlog_bak/* /home/mysql/binlog_bak2
# 编辑my.cnf文件,添加或修改以下参数
vi /etc/my.cnf
# relay_log指定到binlog的备份目录
relay_log = /home/mysql/binlog_bak/mysql-bin
# 手动启动slave
skip_slave_start = 1
# 修改server_id,这步很重要,因为MySQL复制不会应用自身示例产生的SQL
server_id = 2
# 生成master.info文件,写入如下内容。这里的内容需要符合规则即可,无需实际内容。
# 实际上这步只是让MySQL实例启动时认为自己是slave而不是master。
# 如果没有此文件,start slave sql_thread时会报以下错误
# ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO
cat > /usr/local/mysql/data/master.info < /usr/local/mysql/data/relay-log.info < /home/mysql/binlog_bak/mysql-bin.index
# 启动MySQL服务
service mysql start
-- 启动SQL Thread线程
start slave sql_thread;
-- 通过多次执行show slave status命令查看SQL Thread的执行情况
show slave status\G
-- 执行时间:35秒
-- 查询验证
select count(*),min(a),max(a) from t1;
-- 删除slave
stop slave;
reset slave all;
# 复员my.cnf配置
service mysql stop
vi /etc/my.cnf
# relay_log = /home/mysql/binlog_bak/mysql-bin
# skip_slave_start = 1
server_id = 1
service mysql start
mysqlbinlog --start-date="2011-02-27 13:10:12" --stop-date="2011-02-27 13:47:21" jbms_binlog.000002 > temp/002.txt
功能是将时间段内的日志文件转换成txt,注意binlog和temp文件夹是同一目录下。
mysqlbinlog --stop-position="98" jbms_binlog.000002 | mysql -uroot -proot
即可恢复位置为“98”处操作的数据,其中stop也可以换成start。
参考:
如何快速执行 binlog
使用MySQL自身复制来恢复binlog
MySQL数据库备份 误操作 数据恢复