コマンドラインからMySQLデータベースをプレーンテキスト(CSV)バックアップにダンプする


92

mysqldumpは、mysqlが読み取るのに便利な形式でしか出力されないので、避けたいと思います。CSVはより普遍的です(テーブルごとに1つのファイルで問題ありません)。しかし、mysqldumpに利点がある場合、私はすべての耳にします。また、コマンドライン(linux)から実行できるものを希望します。それがmysqlスクリプトである場合、そのようなものを作成する方法へのポインターが役立つでしょう。


回答:


140

一度にテーブルに対応でき、データがバイナリでない-B場合は、mysqlコマンドのオプションを使用します。このオプションを使用すると、Excelなどに簡単にインポートできるTSV(タブ区切り)ファイルが生成されます。

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

または、サーバーのファイルシステムに直接アクセスできる場合は、SELECT INTO OUTFILEこれを使用して実際のCSVファイルを生成できます。

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

ありがとう!2番目の「テーブル」は「データベース」である必要がありますよね?あなたが知っているTSVの代わりにCSVのオプションはありませんか?
ドリーブ2009年

duh-はい、「データベース」が読み込まれているはずです。いいえ、CSVのためのオプションはありません、これは使用せず、私が知っている最良であるMySQLのビルトイン、「INTO OUTFILEを選択する」ことができ CSVを行うが、サーバーではなく、クライアント上のファイルを書き込みます。
アルニタク

出力ファイルを強制的に上書きするには?
JCm

11
相対パス(または単にファイル名)を指定すると、ファイルは現在のシェルディレクトリ(つまり、\. file.sql読み取り元)ではなく、MYSQLディレクトリに表示されます。そのため、インストールによっては、おそらく次の場所にあります/var/lib/mysql/[db_name]/table.csv
Mala

32

MySQL自体では、次のようなCSV出力を指定できます。

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/から


2
指定したディレクトリにダンプファイルが見つからないようです。なぜですか?
JCm

@JCmそれはサーバーにダンプする
Alnitak

26

mysqldump's --tabオプションを使用して、データベース全体を一度にダンプできます。ディレクトリパスを指定する.sqlと、CREATE TABLE DROP IF EXISTS構文で1つのファイルと.txt、タブで区切られた内容のファイルが作成されます。コンマで区切られたファイルを作成するには、以下を使用できます。

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

そのパスは、mysqlユーザーとコマンドを実行するユーザーの両方が書き込み可能である必要があるため、簡単にするために、chmod 777 /tmp/path_to_dump/最初にお勧めします。


1
私はこの答えに戻ってきました。すべてのテーブルを区切りファイルにエクスポートするのが間違いなく最良の方法です。
joevallender 2017年

mysqldump: You must use option --tab with --fields-...
Marco Marsala

rootとして:GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015。私が取らなければならなかった私の場合は/var/lib/mysql-files/(代わりに/tmp/)、MySQLへユーザーを設定します。mysqlと777に権限を設定- stackoverflow.com/a/32737616/1707015
qräbnö

18

select into outfileオプションは私には機能しませんが、SEDを介してタブ区切りファイルをパイプする以下のラウンドアバウトの方法は機能しました:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

1
このコマンドにより、出力ファイルで文字tが置き換えられまし", "た。私が求めていたものとは正確には違います。
BrennanR 2017

9

これが最も簡単なコマンドです

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

列の値にカンマがある場合、次のコマンドで.csvではなく.tsvを生成できます。

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv

CSVの場合:カンマが必要なだけで機能します。mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

「バックアップ」が本当に必要な場合は、テーブル定義、ビュー定義、ストアプロシージャなどのデータベーススキーマも必要です。データベースのバックアップはデータだけではありません。

バックアップ用のmysqldump形式の価値は、mysqlデータベースの復元に使用するのが非常に簡単であることです。簡単に復元できないバックアップはあまり役に立ちません。mysqlサーバーに復元できるようにmysqlデータを確実にバックアップする方法を探している場合は、mysqldumpツールを使用する必要があります。

Mysqlは無料で、さまざまなプラットフォームで動作します。復元できる新しいmysqlサーバーの設定は簡単です。mysqlをセットアップできないため、復元を実行できることをまったく心配していません。

csv / tsvのような壊れやすい形式に基づくカスタムバックアップ/復元が失敗することについては、はるかに心配です。データに含まれるすべての引用符、カンマ、またはタブが正しくエスケープされ、復元ツールによって正しく解析されますか?

データを抽出する方法を探している場合は、他の回答でいくつか参照してください。


ありがとう、とても役に立ちました!あなたは私を納得させた。コマンドラインコマンドを使用してcsvダンプをすばやく取得する理由は他にもあります。私は「受け入れられた答え」のためにそれを差し控えています。(私はおそらく現在の回答からこの時点でそれをつなぎ合わせることができます、私はmysqlスクリプトで推測します)。
2009年

ネイティブメソッドを使用したバックアップと、他の目的のための抽出の両方を実行することには多くの価値があることがわかります。
Zoredache 2009年

mk-parallel-restoreは、mk-parallelダンプで作成されたCSVバックアップを復元できるため、両方のメリットを最大限に活用できます。実際、mk-parallel-restoreは、定義したトリガーが最後に復元されるようにすることで、より適切な処理を行います。
ポールディクソン

3

以下のスクリプトを使用して、csvファイルへの出力を取得できます。ヘッダー付きのテーブルごとに1つのファイル。

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

userはユーザー名、passwordは各テーブルのパスワードを入力し続けたくない場合のパスワードで、mydbはデータベース名です。

スクリプトの説明:sedの最初の式はタブを "、"に置き換えます。そのため、フィールドは二重引用符で囲まれ、コンマで区切られます。2番目は最初に二重引用符を挿入し、3番目は最後に二重引用符を挿入します。そして最後の1つは\ nを処理します。


これはほとんどの場合私が行く必要のある場所に行きましたが、文字「t」がコンマに置き換えられたとき驚きました:stackoverflow.com/a/2610121/8400969
Michael

そして、これは--skip-column-names私のバージョンのmysqlでも同じように言えます
マイケル

2

便利なmaatkitツールスイートの一部であるmk-parallel-dumpを確認してください。--csvオプションを使用して、コンマ区切りファイルをダンプできます。

これにより、個々のテーブルを指定せずにデータベース全体を実行でき、バックアップセットテーブルでテーブルのグループを指定できます。

また、テーブルの定義、ビュー、トリガーを個別のファイルにダンプします。より完全にアクセス可能な形式で完全なバックアップを提供することに加えて、それはまたmk-parallel-restoreで即座に復元可能です


これは理想的なバックアップではないかもしれませんが、共有には完全に素晴らしいです。ありがとうございました!
アトロン

maatkitpercona toolkit今の一部のようですが、対応するツールが見つかりません。
sjas 2017年

1

2行のPowerShellの答え:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

ブームバタブーム

-D =データベースの名前

-e =クエリ

-B =タブ区切り


1

db全体をcsvとしてダンプする場合

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


rm -rf tables_new.txt tables.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.