mysql共享表空間擴容,收縮,遷移

dbasdk發表於2018-03-30
一.擴容innodb檔案
1.關閉mysql db
# /usr/local/mysql/bin/mysqladmin -S /tmp/mysql3307.sock shutdown

2.開啟引數檔案
innodb_data_file_path = ibdata1:512M:autoextend
ibdata1調整至接近實際大小,並在後面追加新的檔案:
innodb_data_file_path = ibdata1:512M;ibdata2:512M:autoextend

3.啟動資料庫
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3307.cnf --user=mysql &

二.縮小表空間
共享表空間檔案,一旦擴充套件無法自動縮小,需要透過手工縮小
1.匯出全部資料庫
# /usr/local/mysql/bin/mysqldump -uroot -p -A -S /tmp/mysql3307.sock > /tmp/3307all.sql
Enter password:

2.關閉mysql db
# /usr/local/mysql/bin/mysqladmin -S /tmp/mysql3307.sock shutdown

3.刪除mysql的資料目錄
rm -rf /home/mysql3307/mysql3307/*

4.初始化mysql
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3307.cnf --initialize-insecure --basedir=/usr/local/mysql --datadir=/home/mysql3307/mysql3307 --user=mysql

5.啟動mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3307.cnf --user=mysql &

6.匯入資料
source /tmp/3307all.sql

三.innodb表空間遷移
原庫表結構:

點選(此處)摺疊或開啟

  1. CREATE TABLE `wwj`.`t1` (
  2.   `id` INT NOT NULL,
  3.   `name` VARCHAR(45) NULL,
  4.   PRIMARY KEY (`id`));
  5.   
  6. alter table wwj.t1 add index idx_name (name) ;

  7. insert into wwj.t1 values(1,'wwj');

1.在目標例項上建立一個相同的表

點選(此處)摺疊或開啟

  1. CREATE TABLE `wwj2`.`t1` (
  2.   `id` INT NOT NULL,
  3.   `name` VARCHAR(45) NULL,
  4.   PRIMARY KEY (`id`));
2.在目標庫上執行ALTER TABLE t DISCARD TABLESPACE;
ALTER TABLE t1 DISCARD TABLESPACE;
- discard的意思就是從資料庫detached,會刪除ibd檔案,保留frm檔案。
- 也就意味著,你可以對frm檔案操作,比如:rename table,drop table ,但是不能對ibd檔案操作,比如:dml

3.在源庫上執行FLUSH TABLES t FOR EXPORT;生成.cfg檔案
flush tables t1 for export;

-rw-r-----. 1 mysql mysql     67 Mar 24 06:59 db.opt
-rw-r-----. 1 mysql mysql    467 Mar 24 18:32 t1.cfg
-rw-r-----. 1 mysql mysql   8586 Mar 24 06:59 t1.frm
-rw-r-----. 1 mysql mysql 114688 Mar 24 06:59 t1.ibd

此時,.cfg檔案在InnoDB的data directory中
flush tables .. for export 會加鎖,這時候,千萬不能退出終端或session,否則加鎖無效且.cfg檔案自動刪除。

4.講.ibd檔案和.cfg檔案複製到目標例項
[root@mysql5 wwj]# cp t1.cfg /home/mysql3306/mysql3306/wwj2
[root@mysql5 wwj]# cp t1.ibd /home/mysql3306/mysql3306/wwj2
修改許可權

5.在源庫執行unlock tables;
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

6.在目標庫執行ALTER TABLE t IMPORT TABLESPACE;

第一次執行:在目標庫追加index後成功
mysql> alter table t1 import tablespace;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: wwj2

ERROR 1808 (HY000): Schema mismatch (Number of indexes don't match, table has 1 indexes but the tablespace meta-data file has 2 indexes)

innodb可傳輸表空間注意事項
-----------------------------
必須開啟 innodb_file_per_table
當這個表處於quiesced狀態,甚至不能被select
兩邊例項的page size 一致
5.7 版本之前,不支援分割槽表transport
外來鍵相關的表,必須設定 foreign_key_checks=0 才能成功
ALTER TABLE ... IMPORT TABLESPACE 不需要.cfg metadata file . 但是,這樣的話,MySQL就不會對schema進行verificate
5.6以及更高版本,import&export 版本必須在同一個series
在replication環境中,master & slave 都必須開啟 innodb_file_per_table
對於InnoDB general tablespace,不支援discard & import tablespace
如果兩邊伺服器的table row_format設定的不一樣,會導致schema mismatch error
加密過的InnoDB tablespace 必須要複製.cfp 檔案

四.MyISAM表空間遷移
1. flush table with read lock
2. 直接複製資料檔案和表結構檔案

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2152422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章