insert select帶來的問題

2021-10-05 00:00:00 字數 1887 閱讀 7871

當使用 insert…select…進行記錄的插入時,如果select的表是innodb型別的,不論insert的表是什麼型別的表,都會對select的表的紀錄進行鎖定。

對於那些從oracle遷移過來的應用,需要特別的注意,因為oracle並不存在類似的問題,所以在oracle的應用中insert…select…操作非常的常見。

例如:有時候會對比較多的紀錄進行統計分析,然後將統計的中間結果插入到另外乙個表,這樣的操作因為進行的非常少,所以可能並沒有設定相應的索引。如果遷移到mysql資料庫後不進行相應的調整,那麼在進行這個操作期間,對需要select的表實際上是進行的全表掃瞄導致的所有記錄的鎖定,將會對應用的其他操作造成非常嚴重的影響。

究其主要原因,是因為 mysql 在實現複製的機制時和 oracle 是不同的,如果不進行 select 表的鎖定,則可能造成從資料庫在恢復期間插入結果集的不同,造成主從資料的不一致。如果不採用主從複製,關閉 binlog 並不能避免對 select 紀錄的鎖定,某些文件中提到可以通過設定innodb_locks_unsafe_for_binlog來避免這個現象,當這個引數設定為true的時候,將不會對select的結果集加鎖,但是這樣的設定將可能帶來非常嚴重的隱患。如果使用這個binlog進行從資料庫的恢復,或者進行主資料庫的災難恢復,都將可能和主資料庫的執行效果不同。

解決方法:

推薦使用select…into outfile 和 load data infile 的組合來實現,這樣是不會對紀錄進行鎖定的

具體步驟:

例如將t1的資料insert進t3

1、1、mysql> select * into outfile 「/data/t1.txt」 from t1;

將表檔案生成到資料目錄

2、mysql> create table t3 as select * from t1 where 1=2;

建立乙個相同表結構的表

3、mysql> load data infile 「/data/t1.txt」 into table t3;

將檔案載入到新建立的表

注意:1、secure_file_priv

如果這個引數為null,mysql服務會禁止匯入和匯出操作。這個引數在mysql 5.7.6版本引入

如果這個引數設為乙個目錄名,mysql服務只允許在這個目錄中執行檔案的匯入和匯出操作。這個目錄必須存在,mysql服務不會建立它

如果這個引數為空,這個變數沒有效果

這裡將匯出的資料檔案放到資料庫的資料目錄,為的是在匯出資料時不產生許可權錯誤

2、匯出過程有幾個引數可以修改資料檔案的儲存格式:

select * from table into outfile 『/路徑/檔名』

fields terminated by 『,』

enclosed by 『"』

lines terminated by 『\r\n』

● fields子句:在fields子句中有三個亞子句:terminated by、 [optionally] enclosed by和escaped by。如果指定了fields子句,則這三個亞子句中至少要指定乙個。

(1)terminated by用來指定字段值之間的符號,例如,「terminated by 『,』」指定了逗號作為兩個字段值之間的標誌。

(2)enclosed by子句用來指定包裹檔案中字元值的符號,例如,「enclosed by 』 " '」表示檔案中字元值放在雙引號之間,若加上關鍵字optionally表示所有的值都放在雙引號之間。

(3)escaped by子句用來指定轉義字元,例如,「escaped by '』」將「」指定為轉義字元,取代「\」,如空格將表示為「*n」。

● lines子句:在lines子句中使用terminated by指定一行結束的標誌,如「lines terminated by 『?』」表示一行以「?」作為結束標誌。

insert select帶來的問題

當使用 insert.select.進行記錄的插入時,如果select的表是innodb型別的,不論insert的表是什麼型別的表,都會對select的表的紀錄進行鎖定。對於那些從oracle遷移過來的應用,需要特別的注意,因為oracle並不存在類似的問題,所以在oracle的應用中insert....

insert select 帶來的死鎖問題

mysql中 insert select 帶來的問題 當使用insert select 進行記錄的插入時,如果select的表是innodb型別的,不論insert的表是什麼型別的表,都會對select的表的紀錄進行鎖定。對於那些從oracle遷移過來的應用,需要特別的注意,因為oracle並不存在...

INSERT SELECT 的經典用法

insert是t sql中常用語句,insert into table field1,field2,values value1,value2,這種形式的在應用程式開發中必不可少。但我們在開發 測試過程中,經常會遇到需要表複製的情況,如將乙個table1的資料的部分字段複製到table2中,或者將整個...