【MySQL】 已经存在大量数据的表做分区
環境:
? 數據庫版本:5.6
? 系統環境:CentOS 6.8
復制架構:
需求:
? 需要將實例C上面一個2500萬行數據的Innodb引擎的表table進行分區,但是在實例A上面表table不做任何的修改。
思考的問題:
? 在實例C上面的表table做分區,分區之后會不會影響實例A和實例C之間表table的傳輸,會不會造成數據不一致或者插入失敗,或者分區之后插入的數據會比較慢。
實際操作:都是在實例C上面的操作
? 1. stop slave IO_THREAD 停掉IO_THREAD并且等待實例C重放relay log完畢。
? ??Master_Log_File ==?Relay_Master_Log_File and??Read_Master_Log_Pos ==?Exec_Master_Log_Pos 當這倆個表達式成立的時候表明本地的relay log已經重做完畢。
? 2.邏輯備份表table的數據:
?mysqldump?-S?/var/lib/mysql/mysql.sock?-uroot?-p?--single-transaction?--master-data=2?-t?--skip-add-drop-table?sbtest?sbtest1?>?sbtest1.sql參數解釋:-t:不創建table--skip-add-drop-table:不做drop?table操作? ? 在備份的時候不需要drop table 和 create table操作寫入備份的SQL語句中
? 3.更改表名
? ? 更改舊表的表名 rename table sbtest1 to sbtest2; 這樣做的目的是為了在做備份導入的時候不需要更改備份SQL語句,并且萬一分區失敗或者其他的原因至少也有表的備份存在。
? 4.創建空表并且進行分區:
CREATE?TABLE?`sbtest1`?(`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,`k`?bigint(20)?NOT?NULL,`c`?varchar(20)?NOT?NULL,`pad`?varchar(50)?COLLATE?utf8mb4_bin?NOT?NULL,PRIMARY?KEY?(`id`) )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_bin?PARTITION?BY?KEY?(id)?PARTITIONS?64? 新表的表結構要和舊表的表結構一致,唯一不同就是提前分好區。
? 5.導入邏輯備份語句
mysql?-uroot?-p?sbtest?<?sbtest1.sql? 6.導入完畢之后開啟slave并且觀察一段時間
? 7.pt-table-checksum數據一致性檢測(可做可不做)
? ? http://seanlook.com/2015/12/29/mysql_replica_pt-table-checksum/
? 8.建議:
? ? 因為2500萬行的數據的備份會花費比較長的時間,所以在備份的時候建議使用screen,那怕在你遠程回話斷開之后進程還是存在的。
轉載于:https://blog.51cto.com/11819159/2050632
總結
以上是生活随笔為你收集整理的【MySQL】 已经存在大量数据的表做分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码管理 ,git 命令整理
- 下一篇: Android鬼点子 100行代码,搞定