【MySQL】 已经存在大量数据的表做分区
環(huán)境:
? 數(shù)據(jù)庫版本:5.6
? 系統(tǒng)環(huán)境:CentOS 6.8
復(fù)制架構(gòu):
需求:
? 需要將實例C上面一個2500萬行數(shù)據(jù)的Innodb引擎的表table進行分區(qū),但是在實例A上面表table不做任何的修改。
思考的問題:
? 在實例C上面的表table做分區(qū),分區(qū)之后會不會影響實例A和實例C之間表table的傳輸,會不會造成數(shù)據(jù)不一致或者插入失敗,或者分區(qū)之后插入的數(shù)據(jù)會比較慢。
實際操作:都是在實例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 當(dāng)這倆個表達式成立的時候表明本地的relay log已經(jīng)重做完畢。
? 2.邏輯備份表table的數(shù)據(jù):
?mysqldump?-S?/var/lib/mysql/mysql.sock?-uroot?-p?--single-transaction?--master-data=2?-t?--skip-add-drop-table?sbtest?sbtest1?>?sbtest1.sql參數(shù)解釋:-t:不創(chuàng)建table--skip-add-drop-table:不做drop?table操作? ? 在備份的時候不需要drop table 和 create table操作寫入備份的SQL語句中
? 3.更改表名
? ? 更改舊表的表名 rename table sbtest1 to sbtest2; 這樣做的目的是為了在做備份導(dǎo)入的時候不需要更改備份SQL語句,并且萬一分區(qū)失敗或者其他的原因至少也有表的備份存在。
? 4.創(chuàng)建空表并且進行分區(qū):
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? 新表的表結(jié)構(gòu)要和舊表的表結(jié)構(gòu)一致,唯一不同就是提前分好區(qū)。
? 5.導(dǎo)入邏輯備份語句
mysql?-uroot?-p?sbtest?<?sbtest1.sql? 6.導(dǎo)入完畢之后開啟slave并且觀察一段時間
? 7.pt-table-checksum數(shù)據(jù)一致性檢測(可做可不做)
? ? http://seanlook.com/2015/12/29/mysql_replica_pt-table-checksum/
? 8.建議:
? ? 因為2500萬行的數(shù)據(jù)的備份會花費比較長的時間,所以在備份的時候建議使用screen,那怕在你遠程回話斷開之后進程還是存在的。
轉(zhuǎn)載于:https://blog.51cto.com/11819159/2050632
總結(jié)
以上是生活随笔為你收集整理的【MySQL】 已经存在大量数据的表做分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码管理 ,git 命令整理
- 下一篇: Android鬼点子 100行代码,搞定