日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)

發(fā)布時(shí)間:2024/10/12 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解答你也看一下

MySQL5.6在線DDL不鎖表,現(xiàn)在我有一張1億的表,需要增加一個(gè)字段,假如我讓你去增加這個(gè)字段,你應(yīng)該注意什么,具體怎么操作?

操作如下:

1.注意磁盤空間(臨時(shí)表目錄 參數(shù) tmpdir ,因?yàn)樾枰獎(jiǎng)?chuàng)建臨時(shí)表使用 algorithm=default,inplace,copy copy是用臨時(shí)表的方法

lock=default,none,shared,exclusive)

2.當(dāng)前內(nèi)存剩余量

3.當(dāng)前有沒有大的事務(wù)在執(zhí)行

4.innodb_online_alter_log_max_size參數(shù)

5.然后在從上添加,再在主上添加(不記錄binlog),處理完成后再開啟

如果直接先在主上操作,那么會導(dǎo)致主從延遲很大(在量比較大的情況下)。因?yàn)橹鲝膹?fù)制,從庫的SQL線程是單線程,它接收到主庫的BINLOG,要一條一條執(zhí)行,一條SQL卡住了,后面的SQL就會排隊(duì)等待,這時(shí)同步就延遲了

附注:

在之前的版本,InnoDB引擎是通過以下步驟來進(jìn)行DDL的:

1 按照原始表(original_table)的表結(jié)構(gòu)和DDL語句,新建一個(gè)不可見的臨時(shí)表(tmp_table)----> create table tmp_table like original_table;

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等,一行行的把原表數(shù)據(jù)拷貝到臨時(shí)表里,且更新索引)

3 執(zhí)行insert into tmp_table select * from original_table

4 rename original_table和tmp_table,最后drop original_table

5 釋放 write lock。

如果采用第三方工具推薦使用pt-online-schema-change

表上不能有任何的外鍵和觸發(fā)器,否則不能在線DDL

OSC為facebook的php腳本,用來mysql 在線DDL

觸發(fā)器將在線DDL期間的DML操作記錄到緩存日志rowlog中,到copy的最后redo這些DML日志到表上,實(shí)現(xiàn)數(shù)據(jù)一致

pt-osc工作原理:

如果表有外鍵,除非使用 --alter-foreign-keys-method 指定特定的值,否則工具不予執(zhí)行。

1 判斷各種參數(shù),是否符合操作條件

2 創(chuàng)建一個(gè)和原表一樣的空表結(jié)構(gòu)(tmp_table)

3 執(zhí)行表結(jié)構(gòu)修改,然后從原表中copy數(shù)據(jù)到上面創(chuàng)建的新表中

4 在原表上創(chuàng)建3個(gè)觸發(fā)器(名稱格式為pt_osc_庫名_表名_操作類型),當(dāng)copy 數(shù)據(jù)的過程中,把原表的更新操作更新到新表 (注意:如果表中已經(jīng)定義了觸發(fā)器這個(gè)工具就不能工作了)

CREATE TRIGGER `pt_osc_dba_t_del` AFTER DELETE ON `dba`.`t` FOR EACH ROW DELETE IGNORE FROM `dba`.`_t_new` WHERE `dba`.`_t_new`.`id` <=> OLD.`id`

CREATE TRIGGER `pt_osc_dba_t_upd` AFTER UPDATE ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)

CREATE TRIGGER `pt_osc_dba_t_ins` AFTER INSERT ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)

5 copy 完成以后,用rename table 新表代替原表,默認(rèn)刪除原表 (可以指定參數(shù)不刪除原表操作)

6 刪除觸發(fā)器

這里要注意的是。。如果是小表。。直接在主上添加了

深圳@邱治軍 mysql 中文網(wǎng) 9:46:41

大表要結(jié)合業(yè)務(wù)和時(shí)間點(diǎn)考慮是否在主上還是先在從上添加

這個(gè)工具只能用在percona?DB嗎

深圳@邱治軍?mysql中文網(wǎng)群2015/5/29?10:14:02

沒啊

mysql?percona?mariadb都支持

只要是mysql版本

這工具要維護(hù)表的時(shí)候最適用了

定期整理mysql?innodb?表碎片

你剛才說在線加字段,需要有前提條件

前提條件是什么

深圳@邱治軍?mysql中文網(wǎng)群 ?10:29:32

沒啥

添加主鍵要注意一下

普通字段沒啥

主從加字段方法 邱治軍在從庫上添加,再在主庫上添加

1、在從庫設(shè)置stop slave; set? sql_log_bin=0;

2、在從庫添加字段,不要用pt-osc,從庫不能創(chuàng)建觸發(fā)器,直接加字段就行alter table add column

3、在從庫設(shè)置start slave; set? sql_log_bin=1;

4、用mha做在線主從切換

5、在主庫設(shè)置set? sql_log_bin=0;stop slave;

6、主庫加字段? ,不要用pt-osc,從庫不能創(chuàng)建觸發(fā)器,直接加字段就行alter table add column

7、在主庫設(shè)置start slave; set? sql_log_bin=1;

總結(jié)

以上是生活随笔為你收集整理的mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。