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


92

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


답변:


140

한 번에 테이블을 처리 할 수 ​​있고 데이터가 바이너리가 아닌 -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

감사! 두 번째 "테이블"은 "데이터베이스"여야합니다. 맞죠? TSV 대신 CSV 옵션이 없으십니까?
dreeves

네, '데이터베이스'를 읽어야합니다. 아니요, CSV에 대한 옵션이 없습니다. 이것은 CSV 수행 할 수 있지만 클라이언트가 아닌 서버에 파일을 쓰는 MySQL의 기본 제공 'select into outfile'을 사용하지 않고 제가 아는 가장 좋은 방법 입니다.
Alnitak

출력 파일을 강제로 덮어 쓰는 방법?
JCm

11
상대 경로 (또는 단순히 파일 이름)가 제공되면 파일은 현재 쉘 디렉토리 (즉, \. file.sql읽는 위치) 가 아니라 MYSQL 디렉토리에 나타납니다 . 따라서 설치에 따라 다음 위치에서 찾을 수 있습니다./var/lib/mysql/[db_name]/table.csv
Mala

32

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/


2
지정한 디렉토리에서 덤프 된 파일을 찾을 수없는 것 같습니다. 그 이유는 무엇입니까?
JCM

@JCm는 서버에서 덤프
알니 타크

26

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

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

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


1
나는이 답변으로 계속 돌아 왔으며 모든 테이블을 구분 된 파일로 내보내는 가장 좋은 방법입니다.
joevallender

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

루트로 : GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . 내 경우에는 내가 가져 가야했다 /var/lib/mysql-files/(대신 /tmp/777에 권리를 MySQL과 설정 : -) MySQL의에 대한 사용자 설정 stackoverflow.com/a/32737616/1707015을 .
qräbnö

18

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

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

1
이 명령으로 인해 문자 t", " 출력 파일에서 . 정확히 내가 쫓은 것은 아닙니다.
BrennanR

9

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

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

CSV의 경우 : 쉼표가 필요한 곳에서 작동합니다. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

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

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

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

csv / tsv 실패와 같은 깨지기 쉬운 형식을 기반으로하는 사용자 지정 백업 / 복원에 대해 훨씬 더 걱정됩니다. 데이터에있는 모든 따옴표, 쉼표 또는 탭이 올바르게 이스케이프 된 다음 복원 도구에서 올바르게 구문 분석 될 것입니까?

데이터를 추출하는 방법을 찾고 있다면 다른 답변에서 여러 가지를 참조하십시오.


감사합니다, 매우 도움이되었습니다! 당신은 나를 설득했습니다. 하지만 명령 줄 명령을 통해 csv 덤프를 얻는 빠른 방법을 원하는 다른 이유가 있습니다. 나는 "수락 된 대답"에 대해 그것을 참아 내고있다. (그래서 나는 아마도 현재 답변 에서이 시점에서 그것을 함께 모을 수 있었을 것입니다, 나는 mysql 스크립트로 추측합니다).
dreeves

기본 방법을 사용하여 백업하고 다른 목적으로 추출 할 때 많은 가치가 있음을 알 수 있습니다.
Zoredache

mk-parallel-restore는 mk-parallel 덤프로 생성 된 CSV 백업을 복원 할 수 있으므로 두 가지 장점을 모두 활용할 수 있습니다. 실제로 mk-parallel-restore는 정의한 트리거가 마지막에 복원되도록하여 더 나은 작업을 수행합니다.
Paul Dixon

3

아래 스크립트를 사용하여 csv 파일로 출력을 가져올 수 있습니다. 헤더가있는 테이블 당 하나의 파일.

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는 사용자 이름이고 password는 각 테이블에 대한 암호를 계속 입력하지 않으려는 경우 암호이며 mydb는 데이터베이스 이름입니다.

스크립트 설명 : sed의 첫 번째 표현식은 탭을 ""로 대체하므로 필드가 큰 따옴표로 묶이고 쉼표로 구분됩니다. 두 번째는 처음에 큰 따옴표를 삽입하고 세 번째는 끝에 큰 따옴표를 삽입합니다. 마지막 사람이 \ n을 처리합니다.


이것은 대부분 내가 가야 할 곳을 찾았지만 문자 "t"가 쉼표로 바뀌었을 때 놀랐습니다 : stackoverflow.com/a/2610121/8400969
Michael

그리고 이것은 --skip-column-namesmysql의 내 버전에서도 말해야 합니다
Michael

2

항상 유용한 maatkit 도구 모음의 일부인 mk-parallel-dump 를 확인하십시오 . --csv 옵션을 사용하여 쉼표로 구분 된 파일을 덤프 할 수 있습니다.

이렇게하면 개별 테이블을 지정하지 않고도 전체 DB를 수행 할 수 있으며 백업 세트 테이블에 테이블 그룹을 지정할 수 있습니다.

또한 테이블 정의,보기 및 트리거를 별도의 파일로 덤프합니다. 보다 보편적으로 액세스 할 수있는 형태로 완전한 백업을 제공 할뿐만 아니라 mk-parallel-restore를 사용 하여 즉시 복원 할 수도 있습니다.


이것은 이상적인 백업 이 아닐 수 있지만 공유에는 완전히 훌륭합니다. 감사합니다!
atroon

maatkitpercona toolkit지금의 일부인 것 같지만 해당 도구를 찾을 수 없습니다.
sjas

1

두 줄의 PowerShell 답변 :

# 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

붐-바타-붐

-D = 데이터베이스 이름

-e = 쿼리

-B = 탭으로 구분


1

전체 db를 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.