Hapus database mysql ke cadangan teks biasa (CSV) dari baris perintah

93

Saya ingin menghindari mysqldump karena output itu dalam bentuk yang hanya nyaman untuk dibaca mysql. CSV tampaknya lebih universal (satu file per tabel baik-baik saja). Tapi jika ada keuntungan dari mysqldump, saya mendengarkan. Juga, saya ingin sesuatu yang bisa saya jalankan dari baris perintah (linux). Jika itu skrip mysql, petunjuk bagaimana membuat hal seperti itu akan sangat membantu.

dreeves
sumber

Jawaban:

141

Jika Anda dapat mengatasi tabel-pada-waktu, dan data Anda bukan biner, gunakan -Bopsi untuk mysqlperintah. Dengan opsi ini, ini akan menghasilkan file TSV (terpisah tab) yang dapat diimpor ke Excel, dll, dengan cukup mudah:

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

Atau, jika Anda memiliki akses langsung ke sistem file server, gunakan SELECT INTO OUTFILEyang dapat menghasilkan file CSV nyata:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table
Alnitak
sumber
Terima kasih! "tabel" kedua Anda harus "database", bukan? tidak ada pilihan untuk CSV selain TSV yang Anda ketahui?
Dreeves
duh - ya, seharusnya membaca 'database'. Tidak, tidak ada opsi untuk CSV, ini adalah yang terbaik yang saya tahu tanpa menggunakan 'pilih ke file outfile' bawaan MySQL, yang dapat melakukan CSV, tetapi menulis file di server, bukan klien.
Alnitak
bagaimana cara memaksa menimpa file output?
JCm
11
Perhatikan bahwa ketika jalur relatif (atau hanya nama file) diberikan, file tersebut akan muncul di direktori MYSQL Anda, dan bukan direktori shell Anda saat ini (yaitu tempat \. file.sqlmembaca dari). Karena itu, tergantung pada pemasangan Anda, Anda mungkin akan menemukannya di/var/lib/mysql/[db_name]/table.csv
Mala
32

Di MySQL sendiri, Anda dapat menentukan keluaran CSV seperti:

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

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

Paul Tomblin
sumber
2
Saya tidak dapat menemukan file yang dibuang pada direktori yang saya tentukan, mengapa demikian?
JCm
@JCm itu dump di server
Alnitak
26

Anda dapat membuang seluruh database sekaligus dengan mysqldump's --tabopsi. Anda menyediakan jalur direktori dan itu membuat satu .sqlfile dengan CREATE TABLE DROP IF EXISTSsintaks dan .txtfile dengan konten, dipisahkan tab. Untuk membuat file yang dipisahkan koma, Anda dapat menggunakan yang berikut ini:

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

Jalur itu harus dapat ditulis oleh pengguna mysql dan pengguna yang menjalankan perintah, jadi untuk kesederhanaan saya sarankan chmod 777 /tmp/path_to_dump/terlebih dahulu.

chmac
sumber
1
Saya terus kembali ke jawaban ini, ini pasti cara terbaik untuk mengekspor semua tabel ke file yang dipisahkan.
joevallender
mysqldump: You must use option --tab with --fields-...
Marco Marsala
Sebagai root: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . Dalam kasus saya, saya harus mengambil /var/lib/mysql-files/(bukan /tmp/), mengatur pengguna ke mysql: mysql dan mengatur hak ke 777 - stackoverflow.com/a/32737616/1707015 .
qräbnö
18

Pilihan pilih ke file keluar tidak akan berfungsi untuk saya, tetapi cara bundaran di bawah ini untuk menyalurkan file tab-delimited melalui SED melakukannya:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
Sri
sumber
1
Perintah ini mengakibatkan huruf ttersebut diganti dengan ", "di file keluaran. Tidak persis seperti yang saya kejar.
BrennanR
9

Inilah perintah paling sederhana untuk itu

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

Jika ada tanda koma di kolom nilai maka kita dapat menghasilkan .tsv daripada .csv dengan perintah berikut

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
minhas23
sumber
Untuk CSV: ini berfungsi di mana saya hanya perlu koma. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`
3

Jika Anda benar-benar membutuhkan "Backup" maka Anda juga memerlukan skema database, seperti definisi tabel, definisi tampilan, prosedur penyimpanan, dan sebagainya. Cadangan database bukan hanya datanya.

Nilai format mysqldump untuk cadangan secara khusus sangat MUDAH menggunakannya untuk memulihkan database mysql. Cadangan yang tidak mudah dipulihkan jauh kurang berguna. Jika Anda mencari metode untuk mencadangkan data mysql dengan andal sehingga Anda dapat memulihkan ke server mysql maka saya pikir Anda harus tetap menggunakan alat mysqldump.

Mysql gratis dan berjalan di banyak platform berbeda. Menyiapkan server mysql baru yang dapat saya pulihkan itu sederhana. Saya sama sekali tidak khawatir tentang tidak dapat mengatur mysql sehingga saya dapat melakukan pemulihan.

Saya akan jauh lebih khawatir tentang pencadangan / pemulihan khusus berdasarkan format yang rapuh seperti csv / tsv gagal. Apakah Anda yakin bahwa semua tanda kutip, koma, atau tab yang ada di data Anda akan lolos dengan benar dan kemudian diurai dengan benar oleh alat pemulihan Anda?

Jika Anda mencari metode untuk mengekstrak data, lihat beberapa di jawaban lain.

Zoredache
sumber
terima kasih, sangat membantu! Anda meyakinkan saya. saya punya alasan lain untuk menginginkan cara cepat untuk mendapatkan dump csv melalui perintah baris perintah. Saya mengulurkan untuk itu untuk "jawaban yang diterima". (tho saya mungkin bisa mengumpulkannya pada saat ini dari jawaban saat ini, saya kira w / a script mysql).
Dreeves
Saya dapat melihat banyak manfaat memiliki cadangan menggunakan metode asli dan juga mengekstrak untuk tujuan lain.
Zoredache
mk-parallel-restore dapat memulihkan cadangan CSV yang dibuat dengan mk-parallel dump, sehingga Anda bisa mendapatkan yang terbaik dari kedua dunia tersebut. Faktanya, mk-parallel-restore melakukan pekerjaan yang lebih baik dengan memastikan pemicu yang Anda tentukan dipulihkan terakhir.
Paul Dixon
3

Anda dapat menggunakan skrip di bawah ini untuk mendapatkan output ke file csv. Satu file per tabel dengan header.

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

pengguna adalah nama pengguna Anda, kata sandi adalah kata sandi jika Anda tidak ingin terus mengetik kata sandi untuk setiap tabel dan mydb adalah nama database.

Penjelasan skrip: Ekspresi pertama dalam sed, akan menggantikan tab dengan "," sehingga Anda memiliki bidang yang diapit tanda kutip ganda dan dipisahkan dengan koma. Yang kedua menyisipkan petik ganda di awal dan yang ketiga menyisipkan petik ganda di akhir. Dan yang terakhir menangani \ n.

Kiran Pathuru
sumber
Ini sebagian besar membawa saya ke tempat yang harus saya tuju, tetapi terkejut ketika huruf "t" diganti dengan koma: stackoverflow.com/a/2610121/8400969
Michael
Dan ini harus dikatakan --skip-column-namesdalam versi mysql saya, juga
Michael
2

Lihat mk-parallel-dump yang merupakan bagian dari rangkaian alat maatkit yang selalu berguna . Ini dapat membuang file yang dipisahkan koma dengan opsi --csv.

Ini dapat melakukan seluruh db Anda tanpa menentukan tabel individual, dan Anda dapat menentukan grup tabel dalam tabel backupset.

Perhatikan bahwa ini juga membuang definisi tabel, tampilan, dan pemicu ke dalam file terpisah. Selain menyediakan cadangan lengkap dalam bentuk yang lebih dapat diakses secara universal, itu juga segera dapat dipulihkan dengan mk-parallel-restore

Paul Dixon
sumber
Ini mungkin bukan cadangan yang ideal tetapi benar-benar hebat untuk BERBAGI. Terima kasih!
atroon
maatkittampaknya menjadi bagian dari percona toolkitsekarang, tetapi saya tidak dapat menemukan alat yang sesuai.
sjas
1

Jawaban PowerShell dua baris:

# 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

Boom-bata-boom

-D = nama database Anda

-e = kueri

-B = tab-delimited

Ngarai Kolob
sumber
1

Jika Anda ingin membuang seluruh db sebagai 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
veera
sumber