2013-09-21 60 views
1

我試圖執行EXP文件:mysqldump:找不到表格:「|」

#!/usr/bin/expect 

# mysql credentials and connection data 
current_db_name='webui_dev' 
new_db_name='db_2013' 
db_host='localhost' 
db_user='root' 
db_pass='' 


# using a here-document to pass commands to expect. 
# (the commands could be stored in a file as well) 
expect <<EOF 
    log_user 0 
    spawn mysqldump -h "$db_host" -u "$db_user" -p "$current_db_name" | mysql -h "$db_host" -u "$db_user" -p "$new_db_name" 
    expect "password:" 
    send "$db_pass\r" 
    log_user 1 
    expect eof 
EOF 

我執行,如果有-f標誌,我得到一個錯誤:mysqldump: Couldn't find table: "|"

如果我嘗試這種方法

exp_internal 1 
    spawn sh -c "mysqldump -h \"$db_host\" -u \"$db_user\" -p \"$current_db_name\" | mysql -h \"$db_host\" -u \"$db_user\" -p \"$new_db_name\" " 

我得到一個輸出

expect: option requires an argument -- f 
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args] 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {81914} 

expect: does "" (spawn_id exp7) match glob pattern "password:"? no 

expect: does "Enter password: " (spawn_id exp7) match glob pattern "password:"? yes 
expect: set expect_out(0,string) "password:" 
expect: set expect_out(spawn_id) "exp7" 
expect: set expect_out(buffer) "Enter password:" 
send: sending "\r" to { exp7 } 

Enter password: expect: timed out 
+3

'spawn'不會通過shell運行命令,所以它將'|'視爲文字參數,而不是shell管道。 – Barmar

+0

是否有任何解決方法? –

+1

是的,通過shell運行命令。 –

回答

3

當約翰內斯是sayi NG使用shell,他的意思是:

spawn sh -c "mysqldump -h \"$db_host\" -u \"$db_user\" -p \"$current_db_name\" | mysql -h \"$db_host\" -u \"$db_user\" -p \"$new_db_name\"" 
+0

現在它提示輸入密碼((''輸入密碼:'忽略我的'expect'密碼:'' –

+0

'log_user'後面加上'exp_internal 1'以期望顯示匹配失敗的原因。 –

+0

我將此輸出添加到我的問題中! –

1

的mysqldump命令需要的參數,你給出的數據庫名稱後,需要表名是有

因此它是假設|是表名

mysqldump [options] db_name [tbl_name ...] 

更新答案

以轉儲一組一個或多個表,

shell> mysqldump [options] db_name [tbl_name ...] 

一組一個或多個完整的數據庫

shell> mysqldump [options] --databases db_name ... 

或整個MySQL服務器 - 如下所示:

shell> mysqldump [options] --all-databases 
+0

我需要轉儲整個數據庫,而不是表如果你在bash中運行這個表,這個問題並沒有預料到,這僅僅是exp的一個問題。 [服務器] -u [用戶] -p [密碼] db2'是db克隆的標準解決方案! –

+1

使用dbname之前的--database。更多檢查http://dev.mysql.com/doc/refman/5.1/ en/mysqldump.html – developerCK

+0

好的..但這不是問題..試試'mysqldump -h [服務器] -u [用戶] -p [密碼] db1 | mysql -h [服務器] -u [用戶] -p [密碼] db2'。我使用它很多年了,我知道這個命令有效。 –