Programing

명령 줄에서 mysql 데이터베이스를 일반 텍스트 (CSV) 백업으로 덤프

crosscheck 2020. 9. 7. 07:38
반응형

명령 줄에서 mysql 데이터베이스를 일반 텍스트 (CSV) 백업으로 덤프


mysqldump가 읽기에 편리한 형식으로 출력되기 때문에 mysqldump를 피하고 싶습니다. CSV는 더 보편적 인 것 같습니다 (테이블 당 하나의 파일이 좋습니다). 그러나 mysqldump에 장점이 있다면 나는 모두 귀를 기울입니다. 또한 명령 줄 (리눅스)에서 실행할 수있는 기능을 원합니다. 그것이 mysql 스크립트라면 그러한 것을 만드는 방법에 대한 포인터가 도움이 될 것입니다.


한 번에 테이블을 처리 할 수 ​​있고 데이터가 바이너리가 아닌 -B경우 mysql명령에 대한 옵션을 사용합니다 . 이 옵션을 사용하면 Excel 등으로 매우 쉽게 가져올 수있는 TSV (탭으로 구분 된) 파일을 생성합니다.

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

또는 서버의 파일 시스템에 직접 액세스 할 SELECT INTO OUTFILE수있는 경우 실제 CSV 파일을 생성 할 수있는 방법 사용 하십시오.

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

MySQL 자체에서는 다음과 같이 CSV 출력을 지정할 수 있습니다.

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

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


mysqldump의 --tab 옵션을 사용하여 한 번에 전체 데이터베이스를 덤프 할 수 있습니다. 디렉토리 경로를 제공하면 CREATE TABLE DROP IF EXISTS 구문을 사용하여 하나의 .sql 파일과 탭으로 구분 된 내용이있는 .txt 파일이 생성됩니다. 쉼표로 구분 된 파일을 만들려면 다음을 사용할 수 있습니다.

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

이 경로는 mysql 사용자와 명령을 실행하는 사용자가 모두 쓸 수 있어야하므로 단순성을 위해 chmod 777 /tmp/path_to_dump/먼저 권장 합니다.


select into outfile 옵션은 나를 위해 작동하지 않지만 SED를 통해 탭으로 구분 된 파일을 파이핑하는 아래 원형 교차로 방법은 다음과 같습니다.

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

여기에 가장 간단한 명령이 있습니다.

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

열 값에 쉼표가 있으면 다음 명령을 사용하여 .csv 대신 .tsv를 생성 할 수 있습니다.

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

정말로 "백업"이 필요한 경우 테이블 정의, 뷰 정의, 저장 프로 시저 등과 같은 데이터베이스 스키마도 필요합니다. 데이터베이스 백업은 단순한 데이터가 아닙니다.

백업용 mysqldump 형식의 가치는 특히 mysql 데이터베이스를 복원하는 데 사용하기가 매우 쉽다는 것입니다. 쉽게 복원되지 않는 백업은 그다지 유용하지 않습니다. mysql 데이터를 안정적으로 백업하여 mysql 서버로 복원 할 수있는 방법을 찾고 있다면 mysqldump 도구를 사용해야한다고 생각합니다.

Mysql은 무료이며 다양한 플랫폼에서 실행됩니다. 복원 할 수있는 새 mysql 서버를 설정하는 것은 간단합니다. 나는 복원을 할 수 있도록 mysql을 설정할 수 없다는 것에 대해 전혀 걱정하지 않습니다.

I would be far more worried about a custom backup/restore based on a fragile format like csv/tsv failing. Are you sure that all your quotes, commas, or tabs that are in your data would get escaped correctly and then parsed correctly by your restore tool?

If you are looking for a method to extract the data then see several in the other answers.


You can use below script to get the output to csv files. One file per table with headers.

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 is your user name, password is the password if you don't want to keep typing the password for each table and mydb is the database name.

Explanation of the script: The first expression in sed, will replace the tabs with "," so you have fields enclosed in double quotes and separated by commas. The second one insert double quote in the beginning and the third one insert double quote at the end. And the final one takes care of the \n.


Check out mk-parallel-dump which is part of the ever-useful maatkit suite of tools. This can dump comma-separated files with the --csv option.

This can do your whole db without specifying individual tables, and you can specify groups of tables in a backupset table.

Note that it also dumps table definitions, views and triggers into separate files. In addition providing a complete backup in a more universally accessible form, it also immediately restorable with mk-parallel-restore


Two line PowerShell answer:

# 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 = the name of your database

-e = query

-B = tab-delimited


If you want to dump the entire db as 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

참고URL : https://stackoverflow.com/questions/467452/dump-a-mysql-database-to-a-plaintext-csv-backup-from-the-command-line

반응형