mysql Innodb表空間卸載、遷移、裝載的使用方法
條件:
2臺(tái)服務(wù)器:A和B,需要A服務(wù)器上的表遷移到B服務(wù)器。
Innodb表:sysUser,記錄數(shù):351781。
以下測(cè)試在MySQL 5.5.34中進(jìn)行。
開始處理:
1:在B服務(wù)器上建立sysUser表,并且執(zhí)行:
zjy@B : db_test 09:50:30>alter table sysUser discard tablespace;
2:把A服務(wù)器表的表空間(ibd)復(fù)制到B服務(wù)器的相應(yīng)數(shù)據(jù)目錄。
3:修改復(fù)制過來的ibd文件權(quán)限:
chown mysql:mysql sysUser.ibd
4:最后就開始加載:
zjy@B : db_test 10:00:03>alter table sysUser import tablespace;
ERROR 1030 (HY000): Got error -1 from storage engine
報(bào)錯(cuò)了,查看錯(cuò)誤日志:
10:05:44 InnoDB: Error: tablespace id and flags in file './db_test/sysUser.ibd' are 2428 and 0, but in the InnoDB
InnoDB: data dictionary they are 2430 and 0.
InnoDB: Have you moved InnoDB .ibd files around without using the
InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?
InnoDB: Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html
InnoDB: for how to resolve the issue.
10:05:44 InnoDB: cannot find or open in the database directory the .ibd file of
InnoDB: table `db_test`.`sysUser`
InnoDB: in ALTER TABLE ... IMPORT TABLESPACE
當(dāng)遇到這個(gè)的情況:A服務(wù)器上的表空間ID 為2428,而B服務(wù)器上的表空間ID為2430。所以導(dǎo)致這個(gè)錯(cuò)誤發(fā)生,解決辦法是:讓他們的表空間ID一致,即:B找出表空間ID為2428的表(CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;),修改成和sysUser表結(jié)構(gòu)一樣的的表,再import。要不就把A服務(wù)器的表空間ID增加到大于等于B的表空間ID。(需要新建刪除表來增加ID)
要是A的表空間ID大于B的表空間ID,則會(huì)有:
11:01:45 InnoDB: Error: tablespace id and flags in file './db_test/sysUser.ibd' are 44132 and 0, but in the InnoDB
InnoDB: data dictionary they are 2436 and 0.
InnoDB: Have you moved InnoDB .ibd files around without using the
InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?
InnoDB: Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html
InnoDB: for how to resolve the issue.
11:01:45 InnoDB: cannot find or open in the database directory the .ibd file of
InnoDB: table `db_test`.`sysUser`
InnoDB: in ALTER TABLE ... IMPORT TABLESPACE
這時(shí)的情況:A服務(wù)器上的表空間ID 為44132,而B服務(wù)器上的表空間ID為2436。(因?yàn)锳是測(cè)試機(jī)子,經(jīng)常做還原操作,所以表空間ID已經(jīng)很大了,正常情況下。表空間ID不可能這么大。
既然表空間ID不對(duì)導(dǎo)致這個(gè)錯(cuò)誤報(bào)出,那我們手動(dòng)的讓B的表空間ID追上A的表空間ID。
需要建立的表數(shù)量:44132-2436 = 41696個(gè),才能追上。因?yàn)樗旧砭托枰俳⒁粋€(gè)目標(biāo)表,所以需要建立的表數(shù)量為:41695。不過安全起見,最好也不要超過41695,以防B的表空間ID超過了A,則比如設(shè)置安全的值:41690,即使B沒有到達(dá)A表空間ID的值,也應(yīng)該差不多了,可以再手動(dòng)的去增加。用一個(gè)腳本跑(需要建立的表比較多),少的話完全可以自己手動(dòng)去處理:
#!/bin/env python
# -*- encoding: utf-8 -*-
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)
也可以開啟多線程去處理,加快效率。
當(dāng)執(zhí)行完之后,再重新按照上面的1-3步驟進(jìn)行一次,最后再裝載:
zjy@B : db_test 01:39:23>alter table sysUser import tablespace;
Query OK, 0 rows affected (0.00 sec)
要是再提示A表空間ID大于B表的話,就再手動(dòng)的按照腳本里面的方法來增加ID,這時(shí)候就只需要增加個(gè)位數(shù)就可以追上A的表空間ID了。
總結(jié):
上面只是一個(gè)方法,雖然可以遷移Innodb,但是出問題之后可能會(huì)引其Innodb的頁損壞,所以最安全的還是直接用mysqldump、xtrabackup等進(jìn)行遷移。
5.6 可以不用考慮這些tablespace id,可以直接import 進(jìn)來。
2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk
2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk - done!
2013-11-12 15:25:09 2378 [Note] InnoDB: Phase I - Update all pages
2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk
2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk - done!
2013-11-12 15:25:09 2378 [Note] InnoDB: Phase III - Flush changes to disk
2013-11-12 15:25:09 2378 [Note] InnoDB: Phase IV - Flush complete
相關(guān)文章
64位CentOs7源碼安裝mysql-5.6.35過程分享
本文給大家分享的是在64位CentOs7系統(tǒng)中使用源碼安裝mysql-5.6.35的詳細(xì)過程,非常的細(xì)致,有需要的小伙伴可以參考下2017-02-02Mysql的增刪改查語句簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Mysql的增刪改查語句簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-04-04淺析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")
這篇文章主要介紹了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04隨機(jī)生成八位優(yōu)惠碼并保存至Mysql數(shù)據(jù)庫(kù)
這篇文章主要介紹了隨機(jī)生成八位優(yōu)惠碼并保存至Mysql數(shù)據(jù)庫(kù)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02winx64下mysql5.7.19的基本安裝流程(詳細(xì))
這篇文章主要介紹了winx64下mysql5.7.19的基本安裝流程,需要的朋友可以參考下2017-10-10mysql 5.7.14 下載安裝、配置與使用詳細(xì)教程
這篇文章主要介紹了mysql 5.7.14 下載安裝、配置與使用詳細(xì)教程的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09