Mysql

如何在批量插入中查找錯誤行?

  • June 22, 2020

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

這將向您顯示將被插入的行。

這是我可以建議的所有幫助,因為我不知道表結構是什麼。

引用自:https://dba.stackexchange.com/questions/269649