MySQL在線修改表結構pt-osc

MySQL在線修改表結構pt-osc

我們提供的服務有:網站設計制作、成都網站制作、微信公眾號開發、網站優化、網站認證、興隆臺ssl等。為千余家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的興隆臺網站制作公司

    重所周知 MySQL的DDL操作操作是相比比較昂貴的。因為MySQL在修改表期間會阻塞任何讀寫操作。

    基本上業務處于癱瘓。如果數據量較大可能需要好幾個小時才能完成,無法容忍這個操作。Percona開發了一系列的工具 Percona Toolkit包,其中有一個工具pt-online-schema-change可以在線執行DDL操作,不會阻塞讀寫操作從而影響業務程序。當然也有其他的工具 例如 MySQL5.6的online ddl 還有gh-ost 本文主要講pt-online-schema-change在線修改表結構。

原理部分

環境概述 

Percona-Server-5.7.17-11 
Percona-toolkit-3.0.3-1.el7.x86_64

表結構

CREATE TABLE `test` (
  `id` int(40) NOT NULL,
  `name` char(12) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

操作修改非主鍵 name字段

一。準備工作

  1. 設置當前回話參數 session級別

SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'; SET SESSION innodb_lock_wait_timeout=1
SET SESSION lock_wait_timeout=60 SET SESSION wait_timeout=10000
innodb_lock_wait_timeout=1  
lock_wait_timeout=60  
wait_timeout=10000

2.收集MySQL信息

SHOW VARIABLES LIKE 'version%' 
SHOW ENGINES
SHOW VARIABLES LIKE 'innodb_version'
SHOW VARIABLES LIKE 'innodb_stats_persistent'
SELECT @@SERVER_ID
SHOW GRANTS FOR CURRENT_USER()
SHOW FULL PROCESSLIST
SHOW GLOBAL STATUS LIKE 'Threads_running'
SHOW GLOBAL STATUS LIKE 'Threads_running'
SELECT CONCAT(@@hostname, @@port)
SHOW TABLES FROM `test2` LIKE 'test1'
SHOW TRIGGERS FROM `test2` LIKE 'test1'

二 正式開始

1.創建跟舊表一模一樣的新表

 CREATE TABLE `test2`.`_test1_new` (
  `id` int(30) NOT NULL,
  `name` char(27) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.在新表上修改表結構

 ALTER TABLE `test2`.`_test1_new` modify name char(27)

3.創建觸發器

CREATE TRIGGER `pt_osc_test2_test1_del` AFTER DELETE ON `test2`.`test1` FOR EACH ROW DELETE IGNORE FROM `test2`.`_test1_new` WHERE `test2`.`_test1_new`.`id` <=> OLD.`id`

#刪除操作

 CREATE TRIGGER `pt_osc_test2_test1_upd` AFTER UPDATE ON `test2`.`test1` FOR EACH ROW BEGIN DELETE IGNORE FROM `test2`.`_test1_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test2`.`_test1_new`.`id` <=> OLD.`id`;REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)

#更新操作

 CREATE TRIGGER `pt_osc_test2_test1_ins` AFTER INSERT ON `test2`.`test1` FOR EACH ROW REPLACE INTO `test2`.`_test1_new` (`id`, `name`) VALUES (NEW.`id`, NEW.`name`)

#插入操作

4.插入到舊表

EXPLAIN SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE
 IGNORE INTO `test2`.`_test1_new` (`id`, `name`) SELECT `id`, `name` FROM `test2`.`test1` LOCK IN SHARE MODE /*pt-online-schema-change 6291 copy table*/

#有鎖操作LOCK IN SHARE MODE

三 收尾工作

SHOW WARNINGS
SELECT @@SERVER_ID
SHOW GRANTS FOR CURRENT_USER()
SHOW FULL PROCESSLIST
SHOW GLOBAL STATUS LIKE 'Threads_running'
ANALYZE TABLE `test2`.`_test1_new` /* pt-online-schema-change */
RENAME TABLE `test2`.`test1` TO `test2`.`_test1_old`, `test2`.`_test1_new` TO `test2`.`test1`
DROP TABLE IF EXISTS `test2`.`_test1_old`
ROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_del`
DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_upd`
DROP TRIGGER IF EXISTS `test2`.`pt_osc_test2_test1_ins`
SHOW TABLES FROM `test2` LIKE '\_test1\_new'

概述

  1. 查看收集MySQL信息

  2. 創建一個和原表表結構一樣的new表 然后在new表中更改表結構。

  3. 在原表創建3個觸發器 三個觸發器分別對應 insert update delete 操作

  4. 從原表拷貝數據到new表 拷貝過程中原表進行的寫操作都會更新到臨時表

  5. copy完成后rename 原表為old表 接著將new表rename原表 最后刪除old表和觸發器

四 操作注意事項

  • Read the tool’s documentation

  • Review the tool’s known “BUGS”

  • Test the tool on a non-production server

  • Backup your production server and verify the backups

     總結 先看一遍工具文檔,用之前先做測試,備份 備份 備份。在執行在線修改表結構的時候,最好選擇業務低峰期,不要把old表刪掉。

五 pt-osc限制

  • In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is present in the table. See --alter for details.

  • The tool refuses to operate if it detects replication filters. See --[no]check-replication-filters for details.

  • The tool pauses the data copy operation if it observes any replicas that are delayed in replication. See --max-lagfor details.

  • The tool pauses or aborts its operation if it detects too much load on the server. See --max-load and --critical-load for details.

  • The tool sets innodb_lock_wait_timeout=1 and (for MySQL 5.5 and newer) lock_wait_timeout=60 so that it is more likely to be the victim of any lock contention, and less likely to disrupt other transactions. These values can be changed by specifying --set-vars.

  • The tool refuses to alter the table if foreign key constraints reference it, unless you specify --alter-foreign-keys-method.

  • The tool cannot alter MyISAM tables on “Percona XtraDB Cluster” nodes.

六 注意事項

1.先看一遍工具文檔,用之前先做測試,備份 備份 備份。

2.在執行在線修改表結構的時候,最好選擇業務低峰期,不要把old表刪掉。

3.必須有主鍵,無法使用,必須有主鍵,必須有主鍵,必須有主鍵,必須有主鍵。

4.pt-osc如果改變外鍵約束,拒絕工作,除非指定--alter-foreign-keys-method。

5.操作的時候需要指定字符集 防止亂碼。

參考

https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html

本文標題:MySQL在線修改表結構pt-osc
文章網址:http://m.kartarina.com/article14/pphsde.html

成都網站建設公司_創新互聯,為您提供用戶體驗微信小程序關鍵詞優化網站設計靜態網站移動網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 免费人成无码大片在线观看 | 久久精品无码一区二区三区日韩| 无码国产精品一区二区免费式芒果 | 狠狠精品久久久无码中文字幕| 亚洲一区二区三区AV无码| 无码AV中文字幕久久专区| 免费无码一区二区| 日韩人妻精品无码一区二区三区| 亚洲日韩精品A∨片无码加勒比| 狠狠躁天天躁无码中文字幕| 无码日本精品XXXXXXXXX| 无码人妻久久一区二区三区免费 | 狠狠噜天天噜日日噜无码| AV大片在线无码永久免费| 国产在线拍揄自揄拍无码| 免费无码AV一区二区| 亚洲av无码片vr一区二区三区| 国产成A人亚洲精V品无码| 无码免费又爽又高潮喷水的视频| 亚洲视频无码高清在线| 人妻无码第一区二区三区| 国产50部艳色禁片无码| 久久国产精品无码网站| 午夜亚洲av永久无码精品| 人妻少妇精品无码专区动漫| 亚洲天堂2017无码中文| 亚洲色无码专区一区| 久久精品无码专区免费东京热| 亚洲AV无码久久| 久久精品成人无码观看56| 亚洲熟妇无码另类久久久| 免费无码又爽又刺激一高潮| 亚洲精品97久久中文字幕无码| 国产成年无码v片在线| 日韩毛片无码永久免费看| 国产在线无码制服丝袜无码| 韩国无码AV片在线观看网站| 少妇无码AV无码专区线| 久久午夜伦鲁片免费无码| 久久精品国产亚洲AV无码麻豆| 精品国产V无码大片在线看|