2017-02-19 21 views
0

在Ubuntu 14.04終端,我可以從主數據庫轉儲數據庫到從屬:同時爲管道上執行mysqldump的頭使用bash到mysql

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb 

但我同時要重定向在mysqldump的輸出到head -30 > /tmp/pointintime.log這樣我就可以得到及時的信息點:

-- 
-- Position to start replication or point-in-time recovery from 
-- 

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.049868', MASTER_LOG_POS=107; 

如何做到這一點?我試着用tee但這會導致在從進口端SQL語法錯誤(因爲儘管它打破了輸出,而不是發送完整的語句):

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | tee >(head -30 >/tmp/pointintime.log) | mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb 

如何mysqldump進口到從MySQL數據庫,同時檢索head -30的轉儲?我不想先轉儲到文件,因爲數據庫是巨大的,它更有效地通過網絡。

我也使用多個tee重定向嘗試,但有相同的語法錯誤:

mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 --user=myuser --password=[password] --host=127.0.0.1 mydb | tee >(mysql --max_allowed_packet=128M -h 192.168.1.110 -u myuser -p[password] otherdb) >(head -30 >/tmp/pointintime.log) 

ERROR 1064 (42000) at line 47: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near..

回答

1

你不能teehead這樣做是因爲head關閉其輸入手柄一旦有輸出請求線數,打破管道。下面是你應該看到你寫的命令。

mysqldump: Got errno 32 on write

錯誤32是 「斷管」。

另一個錯誤 - 我懷疑 - 是因爲損壞的管道導致輸入句柄mysql被關閉,輸出的部分行已經被寫入,並且當它發生時它接收到的文件的結尾被解釋爲陳述過早結束。

你需要中間的東西,不會破壞管道。建議:瑞士軍鏈鋸... Perl。

替換此:

| tee >(head -30 >/tmp/pointintime.log) | 

有了這個:

| perl -p -e 'print STDERR $_ unless $. > 30' 2>/tmp/pointintime.log | 

-e開關告訴Perl,而不是從文件加載一個Perl腳本,該腳本是遵循引號字符串中。 -p開關會導致每行STDIN都會運行這個小的單行「程序」,然後每個輸入行都將打印到STDOUT,輸入行會在每行通過時暫時出現在變量$_中,並且指示運行線計數器的變量$.。當然STDERR是第二個輸出流,我們將其與2>搭配使用並重定向到您的日誌文件,一旦$. > 30爲真,則不會有更多行寫入日誌中......但它們全部寫入輸出。

那樣簡單。

以這種方式通過Perl管理mysqldump是完全安全的 - 它不會以任何方式操縱數據,它會在它進入時完全寫出它。當我需要即時修改備份流時,我經常這樣做。

+0

不錯,也請詳細解說。 – joshweir