MySQL 备份时遇到的一个问题

MySQL · liushuiwuqing · 于 1年前发布 · 1100 次阅读

备份

/home/dba/tool/percona-xtrabackup-2.0.3/bin/innobackupex --ibbackup=/home/dba/tool/percona-xtrabackup-2.0.3/bin/xtrabackup_55 --user=root --password=*** --defaults-file=/home/dba/mysqlnode/my2.cnf  --no-timestamp --compress  /data1/bakvar1>>/data1/bak.log 2>&1

执行一个脚本的备份,让这个脚本在后台执行,最后执行的结果日志如下:

xtrabackup: Transaction log of lsn (3279994997973) to (3279994997760) was copied.
160425 19:46:32  innobackupex: All tables unlocked
160425 19:46:32  innobackupex: Connection to database server closed

innobackupex: Backup created in directory '/data2/bakvar1'
innobackupex: MySQL binlog position: filename 'mysql-bin.000021', position 163054479
160425 19:46:32  innobackupex: completed OK!

可以看到 lsn 是复制到 lsn (3279994997973) to (3279994997760) 并且是执行成功的。

奇怪的结果

今天早上 qpress 解压缩,然后执行 apply-log 的时候结果遇到了下面的问题:

InnoDB: Reading tablespace information from the .ibd files...
160427 21:02:06  InnoDB: ERROR: We were only able to scan the log up to
InnoDB: 3279994997760, but a checkpoint was at 3279994997973.
InnoDB: It is possible that the database is now corrupt!
InnoDB: In a MySQL replication slave the last master binlog file
InnoDB: position 0 867337, file name mysql-bin.009903
InnoDB: and relay log file
InnoDB: position 0 867482, file name ./mysqld-relay-bin.000053
InnoDB: Last MySQL binlog file position 0 132189247, file name /home/dba/mysqlnode/nodedata1/mysql-bin.000021
160427 21:02:10  InnoDB: Waiting for the background threads to start
160427 21:02:11 Percona XtraDB (http://www.percona.com) 1.1.8-20.1 started; log sequence number 3279994997973
innobackupex: Error:
innobackupex: ibbackup failed at /home/dba/tool/percona-xtrabackup-2.0.3/bin/innobackupex line 378.

可以看到

160427 21:02:06  InnoDB: ERROR: We were only able to scan the log up to
InnoDB: 3279994997760, but a checkpoint was at 3279994997973. 

这个说明了我在第一步执行的备份过程中的时候,并没有把所有需要的 LSN 完全复制完毕?导致数据需要利用 innodb 的 redo log 来达到一致性的时候发现redo log 并没有达到它需要的 LSN ?

这个肯定不是跟网上说的需要 innodb_log_file_size 等参数设置的跟 master 一致的问题,感觉更有可能是 xtrabakcup 备份出现了一些问题。

数据库详情: 版本:mysql 5.5.20-v3i (姜承尧的 innosql) 数据量:220G 左右(inodb_file_per_table=1)

我看了下 MySQL 中文网的一个问题:http://imysql.com/2015/04/23/mysql-faq-mysqld-start-fail-case1.shtml 感觉他有可能遇到了和我相同的问题,只是他说的是把下面的参数和 master 配置成一样的时候就可以了:

innodb_data_file_path
innodb_log_file_size
innodb_log_files_in_group
innodb_file_per_table

这个我觉的第2、3 个参数根本不是必须的,之所以出现了那个问题,是因为这个备份本身就有问题。如果 拿到那个相同的备份,在 apply-log 的时候就应该会出现 MySQL 中文网上出现的那个问题。

这是我对那篇文章的看法(他的网站没法评论。。)

yejr,你好,最近遇到了这个问题。 如果那位同学按照 全备份、apply-log copy-back mysqld-safe 启动的流程来走的话,应该是在 apply-log 就会遇到类似下面的错误。

2015-03-30 15:37:58 7f4ce4d68700 InnoDB: Error: page 6327 log sequence number 2740254445
InnoDB: is in the future! Current system log sequence number 2740251356.

因为 xtrabackup  备份的时候并没有把 ib_logfile* 文件复制过来的。只是复制了部分 redo log 在 xtrabackup_logfile 文件中的。由于不知道具体细节,希望能联系到网友的具体细节。

下面是我复制了我备份时候的目录(数据损坏的那个数据目录 database 用db1 db2 代替)

[dba@db-25 35_4331]$ ls
backup-my.cnf  db1      mysql               test               xtrabackup_binlog_info  xtrabackup_logfile
db2        ibdata1.qp  performance_schema  xtrabackup_binary  xtrabackup_checkpoints

如果有经验的 DBA 大佬看到了,还请大家给点指点,小弟在此谢过。

明明备份显示成功了,可是在还原的时候出现了问题,并且我强制的copy-back 、启动的时候无法启动,请问遇到着这种情况 如何有效的让其启动呢,现在想到的方法就是 http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html 提到的设置 innodb_force_recovery 参数强制启动.

ps:这样的案例是不是说明以后备份的日志中即使出现了 `innobackupex: completed OK! ` 的提示, 也不能保证数据能够安全的还原呢。


共收到 4 条回复 MySQL DBA Xtrabackup innobackupex
ruyi#11年前 0 个赞

首先apply-log是和数据库启动没有关系的,不需要启动数据库即可完成的。看起来像是备份出现了一些问题。你看下这篇文章 http://www.dba-china.com/topic/32 了解下xtrbackup原理, 还有就是xtrabackup版本太低了,2.0是很早之前的版本,用太低版本备份新版的mysql,可能会遇到一些bug ,可以用新版本试试。

ruyi#21年前 0 个赞

再补充一下,无论是配置上面那四个参数,还是使用innodb_force_recovery参数,都是在启动MySQL环境。但是按照流程来说,第一步先apply-log,第二步是copy ,第三步才是调整参数启动MySQL。你目前这种情况是在第一步报错,不存在调整启动参数问题,很明显 备份没有成功。

@ruyi #1楼 谢谢你的回答,能把你们的线上环境 MySQL 版本和 Percona Xtrabackup 版本列出来下吗?最新的一些版本并不支持 MySQL 5.5 的。我用下面的版本备份,会出现这样的错误

2016-05-10 18:26:26 7f0facefb720  InnoDB: Assertion failure in thread 139705302628128 in file fil0fil.cc line 5668
InnoDB: Failing assertion: byte_offset % OS_MIN_LOG_BLOCK_SIZE == 0
InnoDB: We intentionally generate a memory trap.
$ pwd
/home/dba/tool/percona-xtrabackup-2.2.8/bin
$ ls
innobackupex  xbcrypt  xbstream  xtrabackup

可以看到,并没有原来的 xtrabackup_55 的那个二进制文件。

ruyi#41年前 0 个赞
[root@SRV-301067-vm01 /root] eth0 = 10.0.4.27
#innobackupex -v
innobackupex version 2.4.1 Linux (x86_64) (revision id: a2dc9d4)

[root@SRV-301067-vm01 /root] eth0 = 10.0.4.27
#mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30151
Server version: 5.6.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

18:41:38 (none)> 
回复本帖 (需要登录)