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.


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

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


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.


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

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

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.


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.


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


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.