Mysql

Mysqldump 在單個事務中使用 where 子句的多個表

  • March 5, 2019

假設我們有 2 個表:數據庫db中的****t1,t2:期望下面的程式碼根據子句中指定的條件轉儲表:where

mysqldump --login-path=login_path \
   --single-transaction db t1 \
   --where="user_id>200" , t2 --where="id>200" > /tmp/users_data.sql

但是會彈出以下錯誤:

mysqldump: 無法執行 ‘SELECT /*!40001 SQL_NO_CACHE */ * FROM t1 WHERE id>200 Unknown column ‘id’ in ‘where Clause’ (1054)

如何正確使用where子句轉儲多個表mysqldump?如果不可能,是否有解決方法?

MySQL 轉儲只有一個where子句,這使得在兩個表中使用起來很困難,就像你做的那樣。

一種方法是在 t1 中,創建一個名為id有效的生成列user_id

ALTER TABLE t1
ADD id UNSIGNED INT GENERATED ALWAYS AS (user_id),
ADD INDEX id_key ( id)

調整類型以匹配user_id.

參考:https ://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html

解決方案1:-

轉儲表數據使用SELECT ... INTO OUTFILE語句將選定的行寫入文件並使用LOAD DATA語句恢復到表中。

例如。

  • 使用從 Backup Server 備份表
SELECT * INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM DB.T1 WHERE user_id>200;
  • 使用在還原伺服器上創建相同的 T1 表
CREATE TABLE T1 (...) 
  • 將文件從備份伺服器複製到還原伺服器(scp在 Linux 上使用命令)
  • 使用恢復表中的數據
LOAD DATA INFILE '/tmp/result.txt' INTO TABLE DB.T1;

解決方案2: -

需要準備 shell 腳本,它將值傳遞mysqldump給每個表的命令中的 where 選項。

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