从master的原始备份恢复从属MySQL数据库会导致InnoDB表空间错误

我有一个主/从复制设置,我在超过7000个数据库中使用InnoDB和MyISAM表,我想从主复制到从复制复制。

两台服务器都运行Ubuntu 10.04.2 LTS(使用mysql-server 5.1.41-3ubuntu12软件包)。 最近我试图升级MySQL,希望能够解决一些新版本已经解决的bug – 所以我的奴隶现在是Ubuntu 10.10。 但是,问题似乎是一样的。

我不想打扰我的主人,所以我已经尝试了我的整个光盘的LVM快照,以便我可以通过rsync将我的数据和日志目录复制到我的奴隶:
/ var / lib / mysql:其中我的ibdata1和ib_logfile0,以及所有.ibd和.frm文件都存储在其中。 我用innodb_file_per_table,所以有很多的.idb文件。
/ var / log / mysql:我在哪里保留所有的二进制日志

一旦复制,我重置权限:

chown mysql.mysql /var/lib/mysql -R chown mysql.mysql /var/log/mysql -R 

我从/ var / lib / mysql目录中删除master.info和relay-log.info文件。 (因为我的主人实际上是奴隶到另一个主人,某些表)。

然后我尝试在从机上启动mysql。 不久,我开始在/var/log/mysql.err中看到如下所示的许多错误:

  InnoDB:错误:数据字典中的表空间标识为150238  
 InnoDB:但是在文件./1_107789/email.ibd中是150747! 

要么:

 InnoDB:错误:试图添加名为“./23_4377/link.ibd”的表空间148302
 InnoDB:表空间的内存caching,但表空间
名称为“./1_68522/open.ibd”的InnoDB:148302已经存在于表空间中
 InnoDB:内存caching!

然后每隔一段时间:

  110207 13:55:45 InnoDB:线程2979265392中的断言失败../../../storage/innobase/fil/fil0fil.c line 603
 InnoDB:失败断言:0
 InnoDB:我们故意生成一个内存陷阱。
 InnoDB:提交详细的错误报告到http://bugs.mysql.com。
 InnoDB:如果你重复断言失败或崩溃,甚至
 InnoDB:在mysqld启动之后,可能会有
 InnoDB:InnoDB表空间中的损坏。 请参阅
 InnoDB:http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
 InnoDB:关于强制恢复。
 110207 13:55:45  -  mysqld得到信号6;
这可能是因为你遇到了一个错误。 这个二进制也有可能
或者其中一个链接的图书馆是腐败的,build造不当的,
或错误configuration。 这个错误也可能是由于硬件故障造成的。
我们将尽我们所能来收集一些有希望帮助诊断的信息
这个问题,但是既然我们已经崩溃了,那肯定是错的
这可能会失败。

的key_buffer_size = 16777216
 read_buffer_size = 131072
 max_used_connections = 1
 max_threads的= 10000
 threads_connected的= 1
有可能mysqld最多可以使用 
 key_buffer_size +(read_buffer_size + sort_buffer_size)* max_threads = 868418 K
内存字节
希望没关系; 如果不是,则减less方程中的一些variables。

 thd:0xbc5a7138
试图回溯。 您可以使用以下信息来了解
 mysqld死了。 如果在这之后你看不到任何信息
非常错误
 stack_bottom = 0xb193f13c thread_stack 0x30000
 / usr / sbin / mysqld(my_print_stacktrace + 0x2d)[0xb7638c4d]
 / usr / sbin / mysqld(handle_segfault + 0x494)[0xb7304854]
 [0xb707f400]
 /lib/tls/i686/cmov/libc.so.6(abort+0x182)[0xb6d89a82]
 / usr / sbin / mysqld(+ 0x477790)[0xb7514790]
 / usr / sbin / mysqld(+ 0x47795e)[0xb751495e]
 / usr / sbin / mysqld(fil_space_get_size + 0xdc)[0xb751966c]
 / usr / sbin / mysqld(buf_read_page + 0xad)[0xb75015dd]
 / usr / sbin / mysqld(buf_page_get_gen + 0x331)[0xb74fab21]
 / usr / sbin / mysqld(btr_get_size + 0x190)[0xb75b02b0]
 / usr / sbin / mysqld(dict_update_statistics_low + 0x50)[0xb7503e70]
 / usr / sbin / mysqld(dict_table_get + 0xec)[0xb750682c]
 / usr / sbin / mysqld(+ 0x4cde5f)[0xb756ae5f]
 / usr / sbin / mysqld(row_ins + 0x157)[0xb756d3c7]
 / usr / sbin / mysqld(row_ins_step + 0x110)[0xb756d710]
 / usr / sbin / mysqld(row_insert_for_mysql + 0x37e)[0xb75754de]
 / usr / sbin / mysqld(ha_innobase :: write_row(unsigned char *)+ 0xf9)[0xb74e1299]
 / usr / sbin / mysqld(handler :: ha_write_row(unsigned char *)+ 0x6d)[0xb7412d3d]
 / usr / sbin / mysqld(write_record(THD *,st_table *,st_copy_info *)+ 0x3ba)[0xb7391e2a]
 / usr / sbin / mysqld(mysql_insert(THD *,TABLE_LIST *,List&,List>&,List&,List&,enum_duplicates,bool)+ 0x1122)[0xb73967c2]
 / usr / sbin / mysqld(mysql_execute_command(THD *)+ 0xc85)[0xb7317c95]
 / usr / sbin / mysqld(mysql_parse(THD *,char const *,unsigned int,char const **)+ 0x3ae)[0xb731f45e]
 / usr / sbin / mysqld(Query_log_event :: do_apply_event(Relay_log_info const *,char const *,unsigned int)+ 0x47d)[0xb73dbe9d]
 / usr / sbin / mysqld(Query_log_event :: do_apply_event(Relay_log_info const *)+ 0x26)[0xb73dca76]
 (usb / sbin / mysqld)
 / usr / sbin / mysqld(handle_slave_sql + 0x1094)[0xb74662e4]
 /lib/tls/i686/cmov/libpthread.so.0(+0x596e)[0xb706396e]
 /lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb6e29a4e]
试图得到一些变数。
有些指针可能无效,导致转储中止...
 thd-> 0xb183bdc6查询是一个无效的指针
 thd->的thread_id = 2
 thd->终止= NOT_KILLED
在http://dev.mysql.com/doc/mysql/en/crashing.html手册页包含
信息应该可以帮助你找出造成这次事故的原因。

我一直在摆弄各种各样的select,并试图理解为什么它认为有一个表不匹配。 就我而言,应该没有不匹配,因为我正在复制ibdata1,innodb日志文件以及.ibd。 那么,为什么它不能恢复并继续使用,以便我可以恢复复制? 我明显错过了一些东西,但是我找不到它。

任何线索或build议表示赞赏。 谢谢

我相信你有快照,特别是由于错误

 InnoDB: Error: tablespace id is 150238 in the data dictionary InnoDB: but in file ./1_107789/email.ibd it is 150747! 

这可能不是LVM的错。 在这里和这里谷歌search,这是我的猜测,你需要确保MySQL已经写入所有的磁盘(没有缓冲区),这种变化不会发生locking表安全的一面。 这也可能是由于不同的MySQL版本在innodb代码中发生了某些变化的小机会。 您可以通过在主服务器的克隆/(类似服务器)上尝试确切的快照来排除这一点。 请看看这个

我认为问题在于我复制数据的方式。 由于我的老奴隶已经有了一些数据库,所以我使用rsync来节省复制数据的时间:

 /usr/bin/rsync -rtlP --inplace --delete /snapshot/var/lib/mysql another.host.com::root/var/lib/ 

但是因为我添加了这样的-I选项:

 /usr/bin/rsync -rtlPI --inplace --delete /snapshot/var/lib/mysql another.host.com::root/var/lib/ 

它已经成功地为我工作。 -I(–ignore-times)告诉rsync'不要跳过匹配大小和时间的文件'。 据推测,对文件的较小的次秒级更改(不会更改文件大小或文件时间戳)导致了问题。