前幾日,遇到的問題,表資料量不是很大,研發人員,修改表結構,導致資料庫出現大量元資料鎖等待,由於是5.5版本的資料庫,對錶進行alter操作是要鎖表的。
解決:show processlist;檢視資料庫出現大量元資料鎖等待。
select * from information_schema.innodb_trx;命令檢視,正在獲得鎖的sql
找到之後,將執行緒id 殺死。此時資料庫恢復正常
?有人會想,該sql已經執行了,一段時間,中途kill,那麼表是改了還是沒有改,是改了一部分嗎?
?此時從庫是怎麼做的?
那麼針對這兩個問題,做了個實驗:
環境一主一從:
mysql資料庫修改欄位的過程:
a:建立乙個臨時的新錶,首先複製舊表的表結構包含索引
create table new_table like old_table;
b:給新的表新增欄位等操作
c:把舊表的資料複製過來
insert into new_table(file1,file2...) select file1,file2... from old_table;
d:刪除舊表,重新命名舊表的名字為新錶的名字
1、在主庫執行sql,等資料庫執行完了的情況
(1)在主庫執行alter table wxj2 add address varchar(10) not null;操作之後;
主庫檢視show processlist;此時資料庫顯示 altering table
此時檢視主庫的binlog檔案,並沒有記錄alter table的sql語句,此時登入從庫檢視show processlist;沒有顯示alter table操作。binlog也沒有記錄
(2)等待主庫將這個sql語句執行完了,將執行的sql語句,記錄到自己的binlog日誌中,此時從庫把binlog寫入到自己的中繼日誌中,重複主庫的操作。那麼此時,如果主庫有對該錶大量的寫入,從庫會出現延遲。
2、在主庫執行sql,執行了一半的時候,在主庫將alter操作kill掉,檢視主從的狀況。
(1)在主庫執行alter table wxj2 modify address varchar(100) not null;語句,此時資料庫正在做copy to tmp table.此時binlog沒有記錄,如果此時線上業務出現高峰,阻塞,那麼直接將改語句進行kill掉。binlog是沒有記錄的,因為此時正在拷貝資料,sql還沒有執行完,不記錄 binlog。此時資料庫是沒有任何更改的,從庫當然也沒有。因為主庫沒有記錄binlog。
總結:alter操作,是sql執行完畢,才記錄binlog,中途將sql中止掉,是不記錄binlog的,那麼主庫和從庫都不會修改。
下面是使用pt工具修改表結構,檢視 binlog記錄的格式
在主庫使用工具修改表結構:
pt-online-schema-change --no-version-check --execute --critical-load="threads_running=1200" --alter-foreign-keys-method=auto --alter "add column sie1_length decimal(7,2) not null default 0.00" h=10.205.9.55,p=3306,u=root,p=123456,d=pp,t=wxj2
主庫執行該命令的時候,會把pt工具執行的原理過程都記錄到自己的binlog中,建新表,建立觸發器,alter操作,然後向新錶拷貝資料,此時從庫看到有新的binlog寫入,也會跟著在自己的從庫,重新操作一遍。
此時從庫也會出現延遲!!!!
總結:alter操作是原子性 ,要麼成功,要麼失敗,而pt工具修改,過程是正常sql操作,需要寫入binlog,所以,如果乙個大表使用pt工具修改表結構,binlog會增加很多。
ALTER 簡單操作 mysql
alter 語句 alter 語句用於在已有的表中新增 修改或刪除。刪除列 alter table 表名字 drop 列名稱 例如 刪除test111表中的age列 alter table test1111 drop age 新增列 新增到test1111表列,名為age,約束為not null 注...
mysql 基本操作 alter
檢視資料庫 show databases 新建資料庫 命令 create database 庫名字。選擇資料庫 use 2016test 建立表 create table 表名 欄位1,2,3.auto increment 自增 primary key 主鍵 檢視表結構 describe 表名 顯示...
mysql修改表結構alter
alter ignore table tbl name alter spec alter spec alter specification add column create definition first after column name or add index index name ind...