条件:
2台服务器:A和B,需要A服务器上的表迁移到B服务器。
Innodb表:sysUser,记录数:351781。
以下测试在MySQL 5.5.34中进行。
开始处理:
1:在B服务器上建立sysUser表,并且执行:
2:把A服务器表的表空间(ibd)复制到B服务器的相应数据目录。
3:修改复制过来的ibd文件权限:
4:最后就开始加载:
报错了,查看错误日志:
当遇到这个的情况:A服务器上的表空间ID 为2428,而B服务器上的表空间ID为2430。所以导致这个错误发生,解决办法是:让他们的表空间ID一致,即:B找出表空间ID为2428的表(CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;),修改成和sysUser表结构一样的的表,再import。要不就把A服务器的表空间ID增加到大于等于B的表空间ID。(需要新建删除表来增加ID)
要是A的表空间ID大于B的表空间ID,则会有:
这时的情况:A服务器上的表空间ID 为44132,而B服务器上的表空间ID为2436。(因为A是测试机子,经常做还原操作,所以表空间ID已经很大了,正常情况下。表空间ID不可能这么大。
既然表空间ID不对导致这个错误报出,那我们手动的让B的表空间ID追上A的表空间ID。
需要建立的表数量:44132-2436 = 41696个,才能追上。因为他本身就需要再建立一个目标表,所以需要建立的表数量为:41695。不过安全起见,最好也不要超过41695,以防B的表空间ID超过了A,则比如设置安全的值:41690,即使B没有到达A表空间ID的值,也应该差不多了,可以再手动的去增加。用一个脚本跑(需要建立的表比较多),少的话完全可以自己手动去处理:
import MySQLdb
import datetime
def create_table(conn):
query = \'\'\'
create table tmp_1 (id int) engine =innodb
\'\'\'
cursor = conn.cursor()
cursor.execute(query)
conn.commit()
def drop_table(conn):
query = \'\'\'
drop table tmp_1
\'\'\'
cursor = conn.cursor()
cursor.execute(query)
conn.commit()
if __name__ == \'__main__\':
conn = MySQLdb.connect(host=\'B\',user=\'zjy\',passwd=\'123\',db=\'db_test\',port=3306,charset=\'utf8\')
for i in range(41690):
print i
create_table(conn)
drop_table(conn)
本文地址:https://www.stayed.cn/item/2361
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我