web-dev-qa-db-ja.com

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

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

88
dreeves

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

% 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
137
Alnitak

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/

31
Paul Tomblin

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

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

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

21
chmac

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

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

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

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
8
minhas23

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

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

Mysqlは無料で、さまざまなプラットフォームで実行されます。復元できる新しいmysqlサーバーのセットアップは簡単です。 mysqlをセットアップできないので、復元できるのではないかと心配しているわけではありません。

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

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

3
Zoredache

以下のスクリプトを使用して、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を処理します。

3
Kiran Pathuru

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

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

また、テーブル定義、ビュー、トリガーを個別のファイルにダンプすることに注意してください。より普遍的にアクセス可能な形式で完全なバックアップを提供することに加えて、 mk-parallel-restore ですぐに復元することもできます。

2
Paul Dixon

データベース全体を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
1
veera

PowerShellの2行の答え:

# 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
Kolob Canyon