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.
mysql
command-line
csv
backup
dreeves
sumber
sumber
Jawaban:
Jika Anda dapat mengatasi tabel-pada-waktu, dan data Anda bukan biner, gunakan
-B
opsi untukmysql
perintah. 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 OUTFILE
yang dapat menghasilkan file CSV nyata:SELECT * INTO OUTFILE 'table.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM table
sumber
\. file.sql
membaca dari). Karena itu, tergantung pada pemasangan Anda, Anda mungkin akan menemukannya di/var/lib/mysql/[db_name]/table.csv
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/
sumber
Anda dapat membuang seluruh database sekaligus dengan
mysqldump's --tab
opsi. Anda menyediakan jalur direktori dan itu membuat satu.sql
file denganCREATE TABLE DROP IF EXISTS
sintaks dan.txt
file 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.sumber
mysqldump: You must use option --tab with --fields-...
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 .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
sumber
t
tersebut diganti dengan", "
di file keluaran. Tidak persis seperti yang saya kejar.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
sumber
mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv
`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.
sumber
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.
sumber
--skip-column-names
dalam versi mysql saya, jugaLihat 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
sumber
maatkit
tampaknya menjadi bagian daripercona toolkit
sekarang, tetapi saya tidak dapat menemukan alat yang sesuai.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-delimitedsumber
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
sumber