mysql Innodb表空間解除安裝、遷移、裝載的使用方法
條件:
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2818238/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 遷移表空間,備份單表MySql
- MySQL InnoDB表空間加密MySql加密
- MySQL InnoDB Undo表空間配置MySql
- mysql共享表空間擴容,收縮,遷移MySql
- Linux安裝解除安裝MySQLLinuxMySql
- MySQL InnoDB臨時表空間配置MySql
- Oracle中表空間、表、索引的遷移Oracle索引
- table/index/LOBINDEX遷移表空間Index
- MySQL 增加InnoDB系統表空間大小MySql
- MySQL InnoDB File-Per-Table表空間MySql
- Linux-Ubuntu-mysql-安裝&解除安裝LinuxUbuntuMySql
- Mysql安裝解除安裝與啟停MySql
- MySQL 減少InnoDB系統表空間的大小MySql
- Configure innodb 表空間
- MySQL innodb表使用表空間物理檔案複製表MySql
- MySQL傳輸表空間的簡單使用方法MySql
- MySQL:mysql5.7解壓版安裝與解除安裝MySql
- Oracle 12cbigfile表空間物件遷移Oracle物件
- mac的mysql怎麼解除安裝?MacMySql
- Innodb:Undo 表空間巨大
- Mysql--所有版本安裝以及完全解除安裝MySql
- Linux裝置掛載和解除安裝Linux
- mysql 8.0.29 解除安裝問題MySql
- 【轉載】Linux下徹底解除安裝mysql詳解LinuxMySql
- MySQL InnoDB系統表空間資料檔案配置MySql
- Debian中完全解除安裝MySQL的方法MySql
- JDK的安裝與解除安裝JDK
- window下徹底解除安裝mysqlMySql
- MySQL解除安裝重灌解決方案MySql
- gitlab安裝/遷移/升級流程Gitlab
- 12.2 grid 安裝空間要求
- Python pip的安裝及解除安裝Python
- linux磁碟掛載與解除安裝Linux
- Ubuntu解除安裝和安裝Ubuntu
- cocoapods安裝/解除安裝/使用
- JDK安裝和解除安裝JDK
- docker安裝及解除安裝Docker
- 安裝npm 解除安裝npm 安裝apidocNPMAPI