MySQL 拷貝一個InnoDB分割槽表到另一個例項
拷貝一個InnoDB分割槽表到另一個例項
這個過程演示瞭如何將一個InnoDB分割槽表從一個正在執行的MySQL伺服器例項複製到另一個正在執行的例項。同樣的過程,只要稍微做些調整,就可以在同一個例項上對InnoDB分割槽表執行完全恢復。
1.在源例項上,如果不存在分割槽表,則建立分割槽表。在下面的例子中,建立了一個包含三個分割槽(p0, p1, p2)的表
mysql> use test; Database changed mysql> create table t1(i int) engine=innodb partition by key(i) partitions 3; Query OK, 0 rows affected (0.38 sec) mysql> insert into t1 values(1),(2),(3),(4),(5),(6),(7),(8),(9); Query OK, 9 rows affected (0.03 sec) Records: 9 Duplicates: 0 Warnings: 0 mysql> select * from t1; +------+ | i | +------+ | 4 | | 5 | | 1 | | 6 | | 7 | | 2 | | 3 | | 8 | | 9 | +------+ 9 rows in set (0.00 sec)
在/mysqldata/mysql/test目錄中,對於三個分割槽都有一個單獨的表空間(.ibd)檔案:
[root@localhost ~]# cd /mysqldata/mysql/test [root@localhost test]# ls -lrt 總用量 304 -rw-r-----. 1 mysql mysql 67 3月 15 16:53 db.opt -rw-r-----. 1 mysql mysql 8554 3月 16 15:43 t1.frm -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p1.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p2.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p0.ibd
2.在目標例項上,建立相同的分割槽表:
mysql> use test; Database changed mysql> create table t1(i int) engine=innodb partition by key(i) partitions 3; Query OK, 0 rows affected (0.20 sec)
在/mysqldata/mysql/test目錄中,對於三個分割槽都有一個單獨的表空間(.ibd)檔案:
[root@localhost ~]# cd /mysqldata/mysql/test [root@localhost test]# ls -lrt 總用量 304 -rw-r-----. 1 mysql mysql 67 3月 15 16:55 db.opt -rw-r-----. 1 mysql mysql 8554 3月 16 15:45 t1.frm -rw-r-----. 1 mysql mysql 98304 3月 16 15:45 t1#P#p0.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:45 t1#P#p1.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:45 t1#P#p2.ibd
3.在目標例項上,丟棄分割槽表的表空間。(在將表空間匯入目標例項之前,必須丟棄附加到接收表的表空間。)
mysql> alter table t1 discard tablespace; Query OK, 0 rows affected (0.09 sec)
組成分割槽表表空間的三個.ibd檔案從/mysqldata/mysql/tes目錄中被丟棄,留下以下檔案
[root@localhost ~]# cd /mysqldata/mysql/test [root@localhost test]# ls -lrt 總用量 16 -rw-r-----. 1 mysql mysql 67 3月 15 16:55 db.opt -rw-r-----. 1 mysql mysql 8554 3月 16 15:45 t1.frm
4.在源例項上,執行FLUSH TABLES… FOR EXPORT用於暫停分割槽表並建立.cfg後設資料檔案
mysql> flush tables t1 for export; Query OK, 0 rows affected (0.01 sec)
在源例項的/mysqldata/mysql/test目錄中建立後設資料(.cfg)檔案,每個表空間(.ibd)檔案對應一個後設資料檔案
[root@localhost ~]# cd /mysqldata/mysql/test [root@localhost test]# ls -lrt 總用量 316 -rw-r-----. 1 mysql mysql 67 3月 15 16:53 db.opt -rw-r-----. 1 mysql mysql 8554 3月 16 15:43 t1.frm -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p1.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p2.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 15:43 t1#P#p0.ibd -rw-r-----. 1 mysql mysql 375 3月 16 16:00 t1#P#p1.cfg -rw-r-----. 1 mysql mysql 375 3月 16 16:00 t1#P#p0.cfg -rw-r-----. 1 mysql mysql 375 3月 16 16:00 t1#P#p2.cfg
FLUSH TABLES……FOR EXPORT語句確保對指定表的更改已重新整理到磁碟,以便在例項執行時可以進行二進位制表拷貝。當執行FLUSH TABLES ... FOR EXPORT時,InnoDB會在資料庫目錄中為表的表空間檔案生成一個.cfg後設資料檔案。.cfg檔案中包含匯入表空間檔案時驗證模式的後設資料。FLUSH TABLES ... FOR EXPORT只能在表上執行,而不能在單獨的表分割槽上執行。
5.將.ibd和.cfg檔案從源例項資料庫目錄複製到目標例項資料庫目錄。例如
[root@localhost test]# scp t1*.{ibd,cfg} mysql@192.168.1.243:/mysqldata/mysql/test/ mysql@192.168.1.243's password: t1#P#p0.ibd 100% 96KB 96.0KB/s 00:00 t1#P#p1.ibd 100% 96KB 96.0KB/s 00:00 t1#P#p2.ibd 100% 96KB 96.0KB/s 00:00 t1#P#p0.cfg 100% 375 0.4KB/s 00:00 t1#P#p1.cfg 100% 375 0.4KB/s 00:00 t1#P#p2.cfg 100% 375 0.4KB/s 00:00 [root@localhost test]# [root@localhost test]# ls -lrt 總用量 316 -rw-r-----. 1 mysql mysql 67 3月 15 16:55 db.opt -rw-r-----. 1 mysql mysql 8554 3月 16 15:45 t1.frm -rw-r-----. 1 mysql mysql 98304 3月 16 16:06 t1#P#p0.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 16:06 t1#P#p1.ibd -rw-r-----. 1 mysql mysql 98304 3月 16 16:06 t1#P#p2.ibd -rw-r-----. 1 mysql mysql 375 3月 16 16:06 t1#P#p0.cfg -rw-r-----. 1 mysql mysql 375 3月 16 16:06 t1#P#p1.cfg -rw-r-----. 1 mysql mysql 375 3月 16 16:06 t1#P#p2.cfg
6.在源例項上,使用unlock tables語句來釋放由flush tables ... for export所獲取的鎖:
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)
在源例項上釋放鎖時,會向mysql日誌檔案寫入刪除.cfg檔案的資訊:
2022-03-16T08:08:27.653352Z 10 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p0.cfg' 2022-03-16T08:08:27.653656Z 10 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p1.cfg' 2022-03-16T08:08:27.654214Z 10 [Note] InnoDB: Deleting the meta-data file './test/t1#P#p2.cfg' 2022-03-16T08:08:27.654256Z 10 [Note] InnoDB: Resuming purge
7.在目標例項上,匯入表空間:
mysql> select * from t1; ERROR 1814 (HY000): Tablespace has been discarded for table 't1' mysql> alter table t1 discard tablespace; Query OK, 0 rows affected (0.09 sec) mysql> alter table t1 import tablespace; Query OK, 0 rows affected (0.46 sec) mysql> select * from t1; +------+ | i | +------+ | 4 | | 5 | | 1 | | 6 | | 7 | | 2 | | 3 | | 8 | | 9 | +------+ 9 rows in set (0.01 sec)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2886393/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 從一個表中查詢,插入到另一個表中MySql
- mysql 5.7.11查詢分割槽表的一個問題MySql
- 【MYSQL】 分割槽表MySql
- 【Linux】MBR磁碟分割槽表只能有四個分割槽?Linux
- MySQL 分割槽表探索MySql
- 列表切片賦值給另一個變數,淺拷貝原理解析賦值變數
- Oracle如何把一個表匯出匯入到另一個伺服器上的另一個表裡Oracle伺服器
- Mysql表分割槽實現MySql
- mysql 進行表分割槽MySql
- Mysql表分割槽實操MySql
- 深拷貝和淺拷貝的區別是什麼?實現一個深拷貝
- IMPDP分割槽表注意事項
- [LINUX] Arch Linux 硬碟拷貝式裝系統+新增 home 分割槽Linux硬碟
- 非分割槽錶轉換成分割槽表以及注意事項
- MySQL的分割槽(一)MySql
- MySQL調優之分割槽表MySql
- MySQL 分割槽表知識整理MySql
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- oracle分割槽表和分割槽表exchangeOracle
- (3) MySQL分割槽表使用方法MySql
- MySQL資料表分割槽手記MySql
- SQL Server 表分割槽注意事項HXSQLServer
- MySQL 更新一個表裡的欄位等於另一個表某欄位的值MySql
- Greenplum計算能力估算-暨多大表需要分割槽,單個分割槽多大適宜
- MySQL:Innodb 一個死鎖案例MySql
- mysql~關於mysql分割槽表的測試MySql
- oracle分割槽表和非分割槽表exchangeOracle
- mysql 分割槽MySql
- 在Linux中,如何建立一個分割槽?Linux
- Mysql資料分片技術(一)——初識表分割槽MySql
- 面試題 | 請實現一個深拷貝面試題
- mysql分割槽表佔用大量容量處理(最佳化)及歸檔分割槽表MySql
- 第41期:MySQL 雜湊分割槽表MySql
- 第40期:MySQL 分割槽表案例分享MySql
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- MySql分表、分庫、分片和分割槽MySql
- 一文搞懂Java引用拷貝、淺拷貝、深拷貝Java
- MySQL分表後原分割槽表處理方案MySql