iT邦幫忙

0

MySQL 5.5備份的問題

外獅佬 4 年前4283 瀏覽

因為公司的需求...
不得已...把一些文件...存在MySQL的longblob欄位...
問題來了...
mysqldump...備份出來沒問題...
但是...還原時...無法還原...
有什麼更好的方法?

1 個回答

8
wiseguy
iT邦超人 1 級 ‧ 4 年前
最佳解答

還不還原得回去,得看 mysqldump 時的參數是如何下的:

  1. 如果用關鍵字當欄位名,欄位名就得用反單引號括起來,-Q 不能少,並加上 --allow-keywords
  2. 如果 max-allowed-packet 過小,就不能使用 --opt 或 -e 啟用多行 insert (預設會加,得用 --skip-opt 抑制掉)
  3. 如果新版本 DB 有多欄位,就得用 -c 來啟用具名 insert (不能省略欄位)
  4. 如果有 blob 欄位,要加上 --hex-blob 以免造成 SQL 解析錯誤

匯進去一樣要注意:

  1. 如果匯進去變亂碼,要清除掉,加上 --default-character-set=binary 來匯
  2. 如果有一些無關緊要的小錯誤,不想匯入被中斷,就加 --force

樓主就先加上 --default-character-set=binary 試匯看看,再出錯的話,請貼上錯誤訊息吧。

外獅佬 iT邦大師 1 級 ‧ 4 年前 檢舉

iT邦幫忙MVPwiseguy提到:
max-allowed-packet

這個...已經設定為1024m了...可是...備份時沒問題...還原時...即使本機還原...還是會出現...out of memory...16GB的記憶體...還是一樣...哭

wiseguy iT邦超人 1 級 ‧ 4 年前 檢舉

那就是匯出的時候,沒用 --skip-opt 把 -e 給抑制掉的結果,造成一個 table 只會匯出成一個 insert 指令,所以匯入時,那個 table 如果 size 有 100GB,那麼你就算把主機所有的記憶體都設為 max-allowed-packet 也沒用。因為它會試圖 allocate 這個 insert SQL 指令的大小。allocate 不到那麼大的記憶體,就會回報 out of memory 了。
所以現在要對付這個以擴充型 insert 匯出的 SQL,最差的情況就是寫程式把擴充型 insert 復原成標準 insert 囉。

我要發表回答

立即登入回答