如果是對MySQL整個表數據導出,可以參照文章:http://www.crazyant.net/1355.html
然而也會遇到的場景是,需要執行一個SQL語句,然后將SQL語句的結果輸出到文件;
方法一:使用MySQL的select * into outfile ‘/tmp/rs.txt’ from tb_name句型
這是個不可行的方法;
舉個例子,執行以下的SQL語句:
1
|
mysql -h10.10.10.10 -ucrazyant -p123456 -P3306 -e "use test; select * into outfile '/tmp/rs.txt' from tb_test;"
|
這個SQL總會報出下面的錯誤:
1
|
ERROR1045(28000)atline1:Accessdeniedforuser'crazyant'@'10.10.10.10'(usingpassword:YES)
|
原因是這個語句並不是在MySQL客戶端,而是在MySQL的服務器上執行的,通常用於服務器管理員在服務器機器上進行數據備份使用,由於MySQL客戶端賬號並沒有訪問服務器機器本身的權限,所以這個SQL執行不會成功。
方法2:直接將SQL執行的結果重定向到文件即可
執行下面的命令,能夠將SQL語句執行的結果輸出到文件:
1
|
mysql -h10.10.10.10 -ucrazyant -p123456 -P3306 -Ne "use test; select * from tb_test;" > /tmp/rs.txt
|
其中-Ne是執行這個SQL語句的選項,-N代表輸出SQL語句執行結果中不帶第一行的字段名稱,-e表示要執行SQL語句;
執行下面的命令,則可以執行SQL文件,並把結果輸出到文件:
新建一個文件,名稱為runsql.sql,內容為:
1
|
usetest;select *fromdb_test;
|
然后這樣執行命令:
1
|
mysql-h10.10.10.10-ucrazyant-p123456-P3306-N<runsql.sql> /tmp/rs.txt
|
其中-N命令仍然表示不輸出表頭字段說明(第一行),小於號表示輸入重定向,runsql.sql的文件內容會被發送給mysql的命令,大於號則表示輸出重定向,會將命令執行的結果輸出到文件;
導出csv文件,逗號分隔符:
1
|
mysql-h10.10.10.10-ucrazyant-p123456-P3306-N<runsql.sql | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > /tmp/rs.txt
|
總結:
- select into outfile只能在MySQL服務器上執行,客戶端上無法執行;
- mysql -Ne “sql” > rs.txt可以將SQL語句執行后輸出為文件
- mysql -N < runsql.sql > rs.txt可以執行sql文件中的內容,然后將結果輸出到文件;
- mysql -N的選項,表示輸出時不帶表頭