Mysql

我真的擺脫不了mysqldump中的這些條件語句?

  • September 11, 2019

我的 mysqldump DDL 文件充滿了很多:

/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `my_trigger`...

我一直在尋找無濟於事的選項來保持沉默。

我的理解是,這種輸出是必要的,這樣腳本才能在可能是另一個版本的 mysql 伺服器中成功地重新創建模式。對於我的安裝系統封閉的場景,我知道版本將與轉儲源相同。

同樣,我需要能夠在轉儲中進行編輯(手動或腳本),而這些輸出使任務變得更加艱鉅。

在 SO 的其他地方,我看到了一些關於此的問題,但人們一直專注於宣傳為什麼應該不理會代幣。Kinder 的人建議在命令行上解析輸出以過濾掉它們。請注意,當我使用 phpMyAdmin 轉儲時,這些令牌不存在。

是的!

那麼,真的沒有更好的選擇來跳過這種輸出嗎?我在 Windows 和 PowerShell 上工作。

保留條件執行註釋非常重要。但是,如果您絕對知道將載入轉儲的 MySQL 版本大於或等於創建它的版本,則可以使用以下命令刪除“註釋”部分:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

它將轉換行,例如

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

SET SQL_MODE=@OLD_SQL_MODE ;

因為這一行必須在任何 MySQL >= 4.1.1 上執行

請注意,這不會刪除多行條件執行註釋,例如在轉儲觸發器時。

由於無法預測未來,因此最好儲存帶有註釋的轉儲,並且僅在您想要將其視覺化時將其刪除。

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql

你不想讓它沉默。這些選項是為了保護您(或至少保護經驗不足的 MySQL 使用者)。

您可以嘗試使用的唯一選項是–compatible

生成與其他數據庫系統或舊 MySQL 伺服器更兼容的輸出。name 的值可以是 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_table_options 或 no_field_options。要使用多個值,請用逗號分隔它們。這些值與設置伺服器 SQL 模式的相應選項具有相同的含義。請參閱第 5.1.8 節,“伺服器 SQL 模式”。

此選項不保證與其他伺服器的兼容性。它僅啟用目前可用於使轉儲輸出更兼容的那些 SQL 模式值。例如,–compatible=oracle 不會將數據類型映射到 Oracle 類型或使用 Oracle 註釋語法。

嘗試做

mysqldump --compatible=mysql40,no_field_options,no_key_options --no-data --skip-routines

只是為了試驗,看看以 MySQL 為中心的註釋元命令是否消失。

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