MySQL分割槽如何遷移
| 背景
需求來源
MySQL越來越流行,而且儲存在MySQL的資料量也越來越大,單表資料達億行已經是非常常見的現象,而這些表裡面儲存了大量的歷史記錄,嚴重影響SQL執行的效率。本文是針對客戶需求,遷移MySQL Innodb大表分割槽中部分歷史歸檔分割槽到其他例項或者其他庫表,而且遷移過程儘量減少對業務環境的影響。
環境介紹
-
MySQL 5.7.21
-
Centos 7.4
-
innodb_file_per_table=1
| MySQL常用的Innodb遷移方法
-
MySQL Enterprise Backup(物理備份,類似於xtrabackup)
-
Copying Data Files (冷備份)
-
邏輯匯出和匯入(mysqldump,mydumper,mysqlpump)
-
可傳輸的表空間
| 遷移方案(可傳輸的表空間)
準備工作
-
MySQL版本必須是5.7
-
遷移過程中存在短暫時間內業務不可寫,建議提前做好準備
操作步驟
檢視需要遷移表(原表)結構
root@localhost : testdba 02:03:18> use test Database changed root@localhost : test 08:37:50> show create table sbtest2; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | sbtest2 | CREATE TABLE `sbtest2` ( `id` int(10) DEFAULT NULL, `name` varchar(20) COLLATE utf8_bin DEFAULT NULL, `date` int(20) DEFAULT NULL, KEY `idx_fenqu` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin /*!50100 PARTITION BY RANGE (date) (PARTITION p0 VALUES LESS THAN (20161201) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (20170101) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (20170201) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (20170301) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (20170401) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN (20170501) ENGINE = InnoDB, PARTITION p6 VALUES LESS THAN (20170601) ENGINE = InnoDB, PARTITION p7 VALUES LESS THAN (20170701) ENGINE = InnoDB, PARTITION p8 VALUES LESS THAN (20170801) ENGINE = InnoDB, PARTITION p9 VALUES LESS THAN (20170901) ENGINE = InnoDB, PARTITION p10 VALUES LESS THAN (20171001) ENGINE = InnoDB, PARTITION p11 VALUES LESS THAN (20171101) ENGINE = InnoDB, PARTITION p12 VALUES LESS THAN (20171201) ENGINE = InnoDB, PARTITION p13 VALUES LESS THAN (20180101) ENGINE = InnoDB, PARTITION p14 VALUES LESS THAN (20180201) ENGINE = InnoDB, PARTITION p15 VALUES LESS THAN (20180301) ENGINE = InnoDB, PARTITION p16 VALUES LESS THAN (20180401) ENGINE = InnoDB, PARTITION p17 VALUES LESS THAN (20180501) ENGINE = InnoDB, PARTITION p18 VALUES LESS THAN (20180601) ENGINE = InnoDB, PARTITION p19 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) root@localhost : test 12:04:03> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sbtest2'; +----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p0 | 22 | | p1 | 2 | | p2 | 2 | | p3 | 2 | | p4 | 2 | | p5 | 2 | | p6 | 2 | | p7 | 2 | | p8 | 2 | | p9 | 2 | | p10 | 2 | | p11 | 2 | | p12 | 2 | | p13 | 2 | | p14 | 2 | | p15 | 2 | | p16 | 2 | | p17 | 2 | | p18 | 2 | | p19 | 14 | +----------------+------------+ 20 rows in set (0.00 sec)
按照個人遷移分割槽表需求,可以把歷史分割槽遷移到其他MySQL例項,也可以遷移到同一MySQL例項的其他庫中。首先建立與原表相同表結構的分割槽表,在建立分割槽表時,我們只需要建立我們需要遷移的表分割槽結構。例:下面是遷移案例,由於只遷移2017年資料,所以表結構只建立了儲存2017年資料的分割槽(也就是分割槽p2-p13)。
root@localhost : test 01:59:36> create database testdba; Query OK, 1 row affected (0.12 sec) root@localhost : test 01:59:44> use testdba; Database changed root@localhost : testdba 06:04:26> CREATE TABLE `sbtest2` ( -> id int(10), -> name varchar(20), -> date int(20), -> key idx_fenqu(date) -> ) -> PARTITION BY RANGE (date) ( -> PARTITION p2 VALUES LESS THAN (20170201), -> PARTITION p3 VALUES LESS THAN (20170301), -> PARTITION p4 VALUES LESS THAN (20170401), -> PARTITION p5 VALUES LESS THAN (20170501), -> PARTITION p6 VALUES LESS THAN (20170601), -> PARTITION p7 VALUES LESS THAN (20170701), -> PARTITION p8 VALUES LESS THAN (20170801), -> PARTITION p9 VALUES LESS THAN (20170901), -> PARTITION p10 VALUES LESS THAN (20171001), -> PARTITION p11 VALUES LESS THAN (20171101), -> PARTITION p12 VALUES LESS THAN (20171201), -> PARTITION p13 VALUES LESS THAN (20180101) -> ); Query OK, 0 rows affected (0.22 sec)
清除新表所有的分割槽獨立表空間,為匯入原表的分割槽獨立表空間做準備
root@localhost : testdba 02:00:05> use testdba; Database changed root@localhost : testdba 02:00:23> ALTER TABLE sbtest2 DISCARD PARTITION p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 TABLESPACE; Query OK, 0 rows affected (0.27 sec)
在原表中執行FLUSH TABLES ... FOR EXPORT(在分割槽表空間傳輸沒有完成之前,不要退出該會話或者執行unlock tables;操作),用來獲取後設資料校驗檔案.cfg和確保該表的髒頁刷到磁碟,並加共享表鎖
root@localhost : testdba 02:00:24> USE test; Database changed root@localhost : test 02:00:29> FLUSH TABLES test.sbtest2 FOR EXPORT; Query OK, 0 rows affected (0.00 sec) [root@slave test]# cd /var/lib/mysql/data/mydata/test [root@slave test]# ls db.opt sbtest2#P#p10.cfg sbtest2#P#p12.ibd sbtest2#P#p15.cfg sbtest2#P#p17.ibd sbtest2#P#p2.cfg sbtest2#P#p4.ibd sbtest2#P#p7.cfg sbtest2#P#p9.ibd sbtest2#P#p0.cfg sbtest2#P#p10.ibd sbtest2#P#p13.cfg sbtest2#P#p15.ibd sbtest2#P#p18.cfg sbtest2#P#p2.ibd sbtest2#P#p5.cfg sbtest2#P#p7.ibd sbtest2.frm sbtest2#P#p0.ibd sbtest2#P#p11.cfg sbtest2#P#p13.ibd sbtest2#P#p16.cfg sbtest2#P#p18.ibd sbtest2#P#p3.cfg sbtest2#P#p5.ibd sbtest2#P#p8.cfg sbtest2#P#p1.cfg sbtest2#P#p11.ibd sbtest2#P#p14.cfg sbtest2#P#p16.ibd sbtest2#P#p19.cfg sbtest2#P#p3.ibd sbtest2#P#p6.cfg sbtest2#P#p8.ibd sbtest2#P#p1.ibd sbtest2#P#p12.cfg sbtest2#P#p14.ibd sbtest2#P#p17.cfg sbtest2#P#p19.ibd sbtest2#P#p4.cfg sbtest2#P#p6.ibd sbtest2#P#p9.cfg
進入到原表ibd所在的目錄下,把原表需要遷移的分割槽表空間和後設資料校驗檔案.cfg傳輸到新表所在的位置,並賦予許可權
[root@slave test]# cp sbtest2#P#p2.* sbtest2#P#p3.* sbtest2#P#p4.* sbtest2#P#p5.* sbtest2#P#p6.* sbtest2#P#p7.* sbtest2#P#p8.* sbtest2#P#p9.* sbtest2#P#p10.* sbtest2#P#p11.* sbtest2#P#p12.* sbtest2#P#p13.* /var/lib/mysql/data/mydata/testdba/ [root@slave test]# ls ../testdba/ db.opt sbtest2#P#p11.cfg sbtest2#P#p12.ibd sbtest2#P#p2.cfg sbtest2#P#p3.ibd sbtest2#P#p5.cfg sbtest2#P#p6.ibd sbtest2#P#p8.cfg sbtest2#P#p9.ibd sbtest2#P#p10.cfg sbtest2#P#p11.ibd sbtest2#P#p13.cfg sbtest2#P#p2.ibd sbtest2#P#p4.cfg sbtest2#P#p5.ibd sbtest2#P#p7.cfg sbtest2#P#p8.ibd sbtest2.frm sbtest2#P#p10.ibd sbtest2#P#p12.cfg sbtest2#P#p13.ibd sbtest2#P#p3.cfg sbtest2#P#p4.ibd sbtest2#P#p6.cfg sbtest2#P#p7.ibd sbtest2#P#p9.cfg [root@slave test]# chown -R mysql:mysql /var/lib/mysql
切回到執行FLUSH TABLES ... FOR EXPORT語句視窗,釋放共享表鎖
root@localhost : test 02:00:29> USE test; Database changed root@localhost : test 02:01:07> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec)
進入新表所在的例項或新表所在的庫,手動匯入分割槽表空間,進行資料恢復(應用傳輸到新表的分割槽表空間)
root@localhost : test 02:01:07> USE testdba; Database changed root@localhost : testdba 02:01:14> ALTER TABLE sbtest2 IMPORT PARTITION p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 TABLESPACE; Query OK, 0 rows affected (0.62 sec)
表空間遷移完成,資料恢復完成,最後校驗資料準確性
root@localhost : testdba 02:03:16> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sbtest2' and TABLE_SCHEMA='testdba'; +----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p2 | 2 | | p3 | 2 | | p4 | 2 | | p5 | 2 | | p6 | 2 | | p7 | 2 | | p8 | 2 | | p9 | 2 | | p10 | 2 | | p11 | 2 | | p12 | 2 | | p13 | 2 | +----------------+------------+ 12 rows in set (0.00 sec)
| 總結
以上是我們使用MySQL的分割槽表空間傳輸方法,解決了分割槽表歷史資料歸檔到其他例項或者同一例項其他庫的問題。對比邏輯遷移方式mysqldump或者insert .. select ...方式速度更快,資料立即可用,而且對業務的影響更小。
| 作者簡介
嶽雷·沃趣科技資料庫工程師
熟悉MySQL體系結構和innodb儲存引擎工作原理;以及MySQL備份恢復、複製、資料遷移等技術;專注於MySQL、MariaDB開源資料庫,喜好開源技術。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2638041/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 分割槽MySql
- 理解MySQL分割槽MySql
- 搞懂MySQL分割槽MySql
- 【MYSQL】 分割槽表MySql
- MySql建立分割槽MySql
- MySql資料分割槽操作之新增分割槽操作MySql
- MySQL 分割槽表探索MySql
- MySQL的分割槽(一)MySql
- MySQL的分割槽(二)MySql
- 移動分割槽表和分割槽索引的表空間索引
- INFINI Labs 產品更新 | Console 資料遷移支援 Percentiles 均勻分割槽
- Mysql表分割槽實現MySql
- mysql 進行表分割槽MySql
- Mysql表分割槽實操MySql
- Mysql 的分割槽型別MySql型別
- mysql 8.0.17 分割槽特性測試MySql
- MySQL調優之分割槽表MySql
- MySQL 分割槽表知識整理MySql
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- mysql~關於mysql分割槽表的測試MySql
- (3) MySQL分割槽表使用方法MySql
- MySQL資料表分割槽手記MySql
- Mac磁碟如何分割槽?教你Mac系統磁碟自由分割槽教程!Mac
- Linux系統如何進行分割槽?swap分割槽是什麼?Linux
- DBMotion——MySQL遷移利器MySql
- SQL Server大分割槽表沒有空分割槽的情況下如何擴充套件分割槽的方法SQLServer套件
- Linux分割槽方案、分割槽建議Linux
- 對Oracle分割槽表進行表空間遷移並處理ORA-14511問題Oracle
- 第41期:MySQL 雜湊分割槽表MySql
- 第40期:MySQL 分割槽表案例分享MySql
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- MySql分表、分庫、分片和分割槽MySql
- win10 怎麼分割槽_如何給win10系統分割槽Win10
- oracle分割槽表和分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- mysql分割槽表佔用大量容量處理(最佳化)及歸檔分割槽表MySql
- Mysql資料遷移方法MySql
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux