920
京東網上商城
RDS for MySQL 如何使用 Percona Toolkit
下麵介紹常用的 pt-online-schema-change 和 pt-archiver 搭配 RDS MySQL 的使用方法。
注:
- pt-online-schema-change 和 pt-archiver 工具均須指定 --no-version-check 選項方能搭配 RDS MySQL 實例使用。
- 本文樣例使用 Percona Toolkit 2.2.17 版本測試。
- 本文樣例僅做為樣例使用,不承擔任何因此示範導致的問題責任。具體操作手冊請參考 Percona Toolkit 的相關文檔。
1. pt-online-schema-change
pt-online-schema-change 提供在線修改表結構等功能,搭配 RDS for MySQL 5.5 使用可以避免在修改表結構的過程中阻塞應用對表數據的訪問。
由於 RDS MySQL 5.6 支持 online-ddl 功能,可以直接在業務低峰期進行操作,也可以結合 pt-online-schema-change 使用。
注:
- 無論 RDS MySQL 5.5 還是 5.6 版本,也無論是否使用 pt-online-schema-change,在修改表結構過程中都有可能遇到等待表元數據鎖的情況(waiting for table metadata lock)。如果出現這種情況,請參考 RDS MySQL 表上 Metadata lock 的產生和處理
- 表及數據維護操作請在業務低峰期進行。
樣例用表:
CREATE TABLE `x` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(10) DEFAULT NULL,
`recommend_level` double(5,0) DEFAULT NULL,
`name` varchar(30) DEFAULT '101' COMMENT 'change',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
1.1 增加字段
pt-online-schema-change --no-version-check --execute --alter "add column c1 int" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
# h=xxx.mysql.rds.aliyuncs.com -- RDS 實例地址
# P=3306 -- RDS 實例端口
# u=jacky -- RDS 實例用戶
# p=xxx -- RDS 實例用戶密碼
# D=jacky -- RDS 實例數據庫
# t=x -- RDS 實例表名稱
1.2 刪除字段
pt-online-schema-change --no-version-check --execute --alter "drop column c1" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.3 修改字段類型
pt-online-schema-change --no-version-check --execute --alter "modify column c1 bigint unsigned" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.4 添加索引
pt-online-schema-change --no-version-check --execute --alter "add key idx_c1 (c1)" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.5 刪除索引
pt-online-schema-change --no-version-check --execute --alter "drop key idx_c1" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
2. pt-archiver
pt-archiver 是 Percona 官方提供的歸檔工具,用於歸檔大型表中的記錄到另一個表或文件。
樣例用表:
CREATE TABLE `my_tab` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`areaID` varchar(50) DEFAULT NULL,
`area` varchar(60) DEFAULT NULL COMMENT '中文注釋測試',
`father` varchar(12) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_area` (`area`)
) ENGINE=InnoDB AUTO_INCREMENT=3162 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=8;
2.1 歸檔到操作係統文件
pt-archiver --source h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --file '/var/tmp/%Y-%m-%d-%D.%t' --where "id > 3008" --limit 1000 --commit-each --no-version-check
# h=xxx.mysql.rds.aliyuncs.com -- RDS 實例地址
# P=3306 -- RDS 實例端口
# u=jacky -- RDS 實例用戶
# p=xxx -- RDS 實例用戶密碼
# D=jacky -- RDS 實例數據庫
# t=my_tab -- RDS 實例表名稱
# --source -- 指定要被歸檔的數據源
# --charset=utf8 -- 使用的字符集,需與表字符集一致;否則指定 --no-check-charset 參數
# --file -- 指定目標操作係統文件名
# --where "id > 3008" -- 指定 where 過濾條件,過濾出要歸檔的數據
# --limit 1000 -- 每條語句讀取和歸檔的數據行數,默認是 1
# --commit-each -- 每次獲取和歸檔數據後,commit提交
# --no-version-check -- 不做版本檢查,RDS MySQL 必須設置
歸檔後,源表數據減少 150 行。
歸檔操作係統文件中,包含 150 行數據。
2.2 歸檔到另外一個表中
可以將數據歸檔到同實例不同庫下的表中,也可以將數據歸檔到不同實例下的表中。
歸檔操作前,目標表要存在。
2.2.1 歸檔到同實例不同庫下的表
pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --dest h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=my_db,t=my_tab --where "id > 2000" --limit 1000 --commit-each --no-version-check
# --dest -- 指定歸檔到的目標表
目標表中增加了 1008 行數據。
源表中減少了 1008 行數據,剩餘 2000 行數據。
2.2.2 歸檔到不同實例下的表
pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --dest h=rds02.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --where "id > 500" --limit 1000 --commit-each --no-version-check
目標表中增加了 1500 行數據。
源表中減少了 1500 行數據,剩餘 500 行數據。
2.2.3 通過 bulk insert 加速歸檔過程
當需要歸檔的數據量很大,比如第一次做歸檔的時候,可以考慮通過嚐試 bulk insert 的方式來加速歸檔過程。
pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=rd_test,t=large_tab_04 --charset=utf8 --dest h=rds02.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=large_tab_04 --where "1=1" --limit 5000 --commit-each --bulk-insert --no-version-check --statistics
# --bulk-insert -- 批量插入數據,會自動啟用 --bulk-delete --commit-each,每次插入行數通過--limit 選項指定
# --statistics -- 顯示 pt-archiver 本次操作的統計信息。
最後更新:2017-04-21 16:00:39