Mysql
如何在批量插入中查找錯誤行?
MySQL 5.6:我正在嘗試以不同的方式將數據從一個表複製到另一個表。源表位於遠端伺服器上,大約有 500,000 行 - 我使用聯合引擎進行連接。我首先嘗試了這個:
mysql > create table tgt as select * from src;
這非常快,只需要幾秒鐘,但它會發出警告:
... | Warning | 1299 | Invalid TIMESTAMP value in column 'created_timestamp' at row 265975 | | Warning | 1299 | Invalid TIMESTAMP value in column 'created_timestamp' at row 265976 | ... 64 rows in set (0.00 sec)
我試著用一個儲存過程來做,打開一個游標,獲取行並插入它們,但這需要很長時間;10分鐘後我取消了。
那麼,有沒有辦法找到導致問題的行?我試過
select ... limit #first_row,#last_row;
了,但它似乎不起作用,我不確定它是否完全可靠。
要找到您想查看的行,您必須做兩件事:
- 更改創建表的方式
- 更改將數據載入到表中的方式
為什麼要改變創建表的方式???
當你這樣做時
create table tgt as select * from src;
您創建
tgt
沒有任何索引的表。您可以通過執行來驗證這一點show create table src \G show create table tgt \G
你會看到
src
它的索引和tgt
沒有它們。因此,在沒有索引的情況下,表載入將是最快的。如果你至少有一個主鍵。您可以通過一些數字
id
列瀏覽表格。因此,要創建帶有索引的表,請執行以下操作:
create table tgt like src;
然後你可以執行
show create table src \G show create table tgt \G
並看到它們在結構上是相同的。
為什麼要更改將數據載入到表中的方式???
你可以像這樣開始載入
insert into tgt select * from src;
載入完成後,您可以執行
SELECT * FROM tgt WHERE id = 265975; SELECT * FROM tgt WHERE id = 265976;
您可以一瞥該行的外觀,但
created_timestamp
可能未填充該行。如果正確填充,則問題基本上解決了。在不載入數據的情況下查看哪一行的另一種方法
created_timestamp
您可以通過做其他事情來隔離哪些行有問題# mysqldump --skip-extended-insert mydb src > dumpfile.txt # head -265976 dumpfile.txt | tail -2
這將向您顯示將被插入的行。
這是我可以建議的所有幫助,因為我不知道表結構是什麼。