Pertanyaan Buang database mysql ke cadangan plaintext (CSV) dari baris perintah


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). Tetapi jika ada keuntungan untuk mysqldump, saya semua telinga. Juga, saya ingin sesuatu yang dapat saya jalankan dari baris perintah (linux). Jika itu skrip mysql, petunjuk bagaimana membuat hal seperti itu akan sangat membantu.


75
2018-01-21 23:13


asal


Jawaban:


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

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

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

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

119
2018-01-21 23:18



Di MySQL sendiri, Anda dapat menentukan output 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/


26
2018-01-21 23:38



Anda dapat membuang seluruh basis data sekaligus dengan opsi mysqldump --tab. Anda menyediakan jalur direktori dan itu menciptakan satu file .sql dengan CREATE TABLE DROP IF EXISTS sintaks dan file .txt dengan konten, tab dipisahkan. 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

Jalan itu harus bisa ditulis oleh pengguna mysql dan pengguna yang menjalankan perintah, jadi untuk kesederhanaan saya sarankan chmod 777 /tmp/path_to_dump/ pertama.


16
2018-05-09 18:00



Pemilihan opsi outfile tidak akan berhasil untuk saya, tetapi cara bundab pipan tab-delimited file melalui SED melakukan:

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

14
2017-10-16 06:21



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 koma dalam nilai kolom maka kita dapat menghasilkan .tsv bukannya .csv dengan perintah berikut

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

5
2017-10-16 07:59



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

Nilai format mysqldump untuk cadangan secara khusus sangat MUDAH menggunakannya untuk memulihkan basis data mysql. Cadangan yang tidak mudah dipulihkan jauh kurang bermanfaat. Jika Anda mencari metode untuk mem-backup data mysql dengan andal sehingga Anda dapat mengembalikan 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 adalah sederhana. Saya sama sekali tidak khawatir tentang tidak bisa men-setup mysql sehingga saya bisa melakukan restore.

Saya akan jauh lebih khawatir tentang custom backup / restore berdasarkan format yang rapuh seperti csv / tsv gagal. Apakah Anda yakin bahwa semua tanda kutip, koma, atau tab yang ada dalam data Anda akan lolos dengan benar lalu diurai dengan benar oleh alat pengembalian Anda?

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


3
2018-01-22 01:36



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

Ini dapat melakukan seluruh db Anda tanpa menentukan tabel individual, dan Anda dapat menentukan kelompok tabel dalam tabel backup.

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


2
2018-01-21 23:41



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

user 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 mengganti tab dengan "," sehingga Anda memiliki kolom yang diapit tanda kutip ganda dan dipisahkan oleh koma. Yang kedua masukkan kutipan ganda di awal dan yang ketiga masukkan tanda kutip ganda di bagian akhir. Dan yang terakhir mengurus \ n.


2
2017-10-10 16:59



Dua jawaban PowerShell 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 = query

-B = tab-delimited


1
2017-09-14 19:12