Bir mysql veritabanını komut satırından düz metin (CSV) yedeklemesine aktarın


93

Yalnızca mysql'nin okuması için uygun bir biçimde çıktı verdiği için mysqldump'tan kaçınmak istiyorum. CSV daha evrensel görünüyor (tablo başına bir dosya yeterlidir). Ama mysqldump'ın avantajları varsa, tamamen kulağım. Ayrıca, komut satırından (linux) çalıştırabileceğim bir şey istiyorum. Bu bir mysql betiği ise, böyle bir şeyin nasıl yapılacağına dair işaretler yardımcı olacaktır.


Yanıtlar:


142

Tek seferde tabloyla başa çıkabiliyorsanız ve verileriniz ikili değilse -B, mysqlkomut seçeneğini kullanın. Bu seçenekle, oldukça kolay bir şekilde Excel'e vb. Aktarılabilen TSV (sekmeyle ayrılmış) dosyaları oluşturacaktır:

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

Alternatif olarak, sunucunun dosya sistemine doğrudan erişiminiz varsa, SELECT INTO OUTFILEgerçek CSV dosyaları oluşturabilecek olanı kullanın :

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

Teşekkürler! ikinci "tablonuz" "veritabanı" olmalıdır, değil mi? Bildiğiniz TSV yerine CSV seçeneği yok mu?
dreeves

duh - evet, 'veritabanı'nı okumalıydı. Hayır, CSV için bir seçenek yok, bu, MySQL'in yerleşik ' dosyaya seç' özelliğini kullanmadan bildiğim en iyisidir, ki bu CSV yapabilir , ancak dosyaları istemciye değil sunucuya yazar.
Alnitak

çıktı dosyasında üzerine yazmaya nasıl zorlanır?
JCm

11
Göreceli bir yol (veya sadece bir dosya adı) verildiğinde, dosyanın MYSQL dizininizde görüneceğini ve mevcut kabuk dizininizde (yani nereden \. file.sqlokunduğu) görüneceğini unutmayın . Bu nedenle, yüklemenize bağlı olarak muhtemelen şu adreste bulacaksınız/var/lib/mysql/[db_name]/table.csv
Mala


26

mysqldump's --tabSeçeneği ile tüm veritabanını tek seferde boşaltabilirsiniz. Bir dizin yolu tedarik ve tek yaratır .sqldosyayı CREATE TABLE DROP IF EXISTSsözdizimi ve bir .txtiçeriğe sahip dosyası, sekme ayrılmış. Virgülle ayrılmış dosyalar oluşturmak için aşağıdakileri kullanabilirsiniz:

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

Bu yolun hem mysql kullanıcısı hem de komutu çalıştıran kullanıcı tarafından yazılabilir olması gerekir, bu nedenle basitlik için önce öneriyorum chmod 777 /tmp/path_to_dump/.


1
Bu yanıta geri gelmeye devam ettim, tüm tabloları sınırlandırılmış bir dosyaya aktarmanın kesinlikle en iyi yolu bu.
joevallender

mysqldump: You must use option --tab with --fields-...
Marco Marsala

Kök olarak: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . Benim durumumda /var/lib/mysql-files/(yerine /tmp/) almak zorunda kaldım , kullanıcıyı mysql: mysql olarak ayarladım ve hakları 777 - stackoverflow.com/a/32737616/1707015 olarak ayarladım .
qräbnö

18

Dışarı dosyaya seçme seçeneği benim için işe yaramaz, ancak SED aracılığıyla sekmeyle ayrılmış dosyayı borulamanın aşağıdaki dolambaçlı yolu sağladı:

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

1
Bu komut , çıktı dosyasında harfin tyerine geçmesine neden oldu ", ". Tam olarak peşinde olduğum şey değil.
BrennanR

9

İşte bunun için en basit komut

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

Sütun değerinde virgül varsa, aşağıdaki komutla .csv yerine .tsv oluşturabiliriz.

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

CSV için: sadece virgül ihtiyacım olan yerlerde çalışıyor. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

Gerçekten bir "Yedekleme" ye ihtiyacınız varsa, tablo tanımları, tanımları görüntüleme, saklama prosedürleri vb. Gibi veritabanı şemasına da ihtiyacınız vardır. Bir veritabanının yedeği yalnızca veriler değildir.

Yedekleme için mysqldump formatının değeri, özellikle mysql veritabanlarını geri yüklemek için onu kullanmanın çok KOLAY olmasıdır. Kolayca geri yüklenmeyen bir yedek çok daha az kullanışlıdır. Mysql verilerini güvenilir bir şekilde yedeklemek için bir yöntem arıyorsanız, böylece bir mysql sunucusuna geri yükleyebilirsiniz, o zaman mysqldump aracına bağlı kalmanız gerektiğini düşünüyorum.

Mysql ücretsizdir ve birçok farklı platformda çalışır. Geri yükleyebileceğim yeni bir mysql sunucusu kurmak basit. Geri yükleme yapabilmem için mysql kurulumunu yapamama konusunda hiç endişelenmiyorum.

Ben csv / tsv gibi kırılgan bir biçime dayalı özel bir yedekleme / geri yükleme konusunda çok daha endişeli olurdum. Verilerinizdeki tüm alıntılarınızın, virgüllerin veya sekmelerinizin doğru şekilde atlanıp ardından geri yükleme aracınız tarafından doğru şekilde ayrıştırılacağından emin misiniz?

Verileri çıkarmak için bir yöntem arıyorsanız, diğer cevaplarda birkaçını görün.


teşekkürler, çok yardımcı oldu! beni ikna ettin. Yine de bir komut satırı komutu aracılığıyla bir csv dökümü almanın hızlı bir yolunu istemek için başka nedenlerim var. "Kabul edilen cevap" için bekliyorum. (bu noktada muhtemelen mevcut cevaplardan bir araya getirebilirim, sanırım bir mysql betiği ile).
rüya

Hem yerel yöntemi kullanarak bir yedeklemeye sahip olmanın hem de başka amaçlar için çıkarmanın çok değerli olduğunu görebiliyorum.
Zoredache

mk-parallel-restore, mk-parallel dump ile oluşturulan bir CSV yedeğini geri yükleyebilir, böylece her iki dünyanın da en iyisini alabilirsiniz. Aslında, mk-parallel-restore, tanımladığınız tetikleyicilerin en son geri yüklenmesini sağlayarak daha iyi bir iş çıkarır.
Paul Dixon

3

Çıktıyı csv dosyalarına almak için aşağıdaki betiği kullanabilirsiniz. Başlıklarla tablo başına bir dosya.

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

kullanıcı, kullanıcı adınızdır, parola, her tablo için parolayı yazmaya devam etmek istemiyorsanız paroladır ve mydb veritabanı adıdır.

Komut dosyasının açıklaması: sed'deki ilk ifade, sekmeleri "" ile değiştirir, böylece çift tırnak içine alınmış ve virgülle ayrılmış alanlara sahip olursunuz. İkincisi başında çift tırnak, üçüncüsü de sonuna çift tırnak ekler. Ve sonuncusu \ n ile ilgilenir.


Bu beni çoğunlukla gitmem gereken yere götürdü, ancak "t" harfi virgülle değiştirildiğinde şaşırdım: stackoverflow.com/a/2610121/8400969
Michael,

Ve bu --skip-column-namesbenim mysql
Michael,

2

Her zaman kullanışlı olan maatkit araç setinin bir parçası olan mk-parallel- dump'a göz atın . Bu, virgülle ayrılmış dosyaların --csv seçeneğiyle dökümünü alabilir.

Bu, tek tek tabloları belirtmeden tüm veritabanınızı yapabilir ve bir yedekleme küme tablosundaki tablo gruplarını belirtebilirsiniz.

Ayrıca tablo tanımlarını, görünümlerini ve tetikleyicileri ayrı dosyalara döktüğünü unutmayın. Daha evrensel olarak erişilebilir bir biçimde eksiksiz bir yedekleme sağlamanın yanı sıra, mk-parallel-restore ile anında geri yüklenebilir


Bu ideal bir yedekleme olmayabilir, ancak PAYLAŞIM için tamamen harika. Teşekkür ederim!
atroon

maatkitşimdinin bir parçası gibi görünüyor percona toolkit, ancak karşılık gelen araçları bulamıyorum.
sjas

1

İki satırlı PowerShell yanıtı:

# 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 = veritabanınızın adı

-e = sorgu

-B = sekmeyle ayrılmış


1

Tüm db'yi csv olarak dökmek istiyorsanız

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.