一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - mysql Innodb表空間卸載、遷移、裝載的使用方法

mysql Innodb表空間卸載、遷移、裝載的使用方法

2020-01-15 16:35MYSQL教程網 Mysql

從MySQL的Innodb特性中我們知道,Inndob的表空間有共享和獨享的特點,如果是共享的。則默認會把表空間存放在一個文件中(ibdata1),當開啟獨享表空間參數Innodb_file_per_table時,會為每個Innodb表創建一個.ibd的文件。文章討論在獨享表

條件:
2臺服務器:A和B,需要A服務器上的表遷移到B服務器。
Innodb表:sysUser,記錄數:351781。
以下測試在MySQL 5.5.34中進行。
開始處理:
1:在B服務器上建立sysUser表,并且執行:

 

復制代碼代碼如下:

zjy@B : db_test 09:50:30>alter table sysUser discard tablespace;

 

2:把A服務器表的表空間(ibd)復制到B服務器的相應數據目錄。
3:修改復制過來的ibd文件權限:

 

復制代碼代碼如下:

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

 

報錯了,查看錯誤日志:

 

復制代碼代碼如下:

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

 

當遇到這個的情況: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,則會有:

 

復制代碼代碼如下:

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

 

這時的情況: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的值,也應該差不多了,可以再手動的去增加。用一個腳本跑(需要建立的表比較多),少的話完全可以自己手動去處理:

 

復制代碼代碼如下:


#!/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)

 

也可以開啟多線程去處理,加快效率。
當執行完之后,再重新按照上面的1-3步驟進行一次,最后再裝載

 

復制代碼代碼如下:

zjy@B : db_test 01:39:23>alter table sysUser import tablespace;
Query OK, 0 rows affected (0.00 sec)

 

要是再提示A表空間ID大于B表的話,就再手動的按照腳本里面的方法來增加ID,這時候就只需要增加個位數就可以追上A的表空間ID了。
總結:
上面只是一個方法,雖然可以遷移Innodb,但是出問題之后可能會引其Innodb的頁損壞,所以最安全的還是直接用mysqldump、xtrabackup等進行遷移。
5.6 可以不用考慮這些tablespace id,可以直接import 進來。

 

復制代碼代碼如下:

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
 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产美女亚洲精品久久久久久 | 无套大战白嫩乌克兰美女 | 国产精品福利在线观看秒播 | 青春草在线观看精品免费视频 | 亚洲国产在线2o20 | 无人区在线观看免费视频国语 | 四虎在线永久免费视频网站 | 精品国产91高清在线观看 | 成人免费视频一区二区三区 | 污污免费 | 久久久久久88色偷偷 | 日本啊v在线观看 | 好姑娘完整版在线观看中文 | 亚洲天堂色图 | 2021精品国夜夜天天拍拍 | 国产午夜精品不卡视频 | 国产精品免费视频一区一 | 无码中文字幕热热久久 | 免费看男女污污完整版 | 鬼畜重口高h合集长短篇 | 亚洲 日韩 国产 中文视频 | 美女全身无遮挡 | 亚洲国产精品无码中文字幕 | 麻豆视频免费在线观看 | 国产成人亚洲精品一区二区在线看 | 国产欧美一区视频在线观看 | 娇妻被又大又粗又长又硬好爽 | 日韩成人在线视频 | 好吊色永久免费视频大全 | 91网站入口 | 性关系视频免费网站在线观看 | 国产精品久久久久影视不卡 | 国产成人h综合亚洲欧美在线 | 天天色影视综合网 | www视频免费 | 久草在线草a免费线看 | 九九热在线观看视频 | 亚州一区二区 | 色偷偷影院| 久久精品18 | 欧美做受|