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
\. file.sql
읽는 위치) 가 아니라 MYSQL 디렉토리에 나타납니다 . 따라서 설치에 따라 다음 위치에서 찾을 수 있습니다./var/lib/mysql/[db_name]/table.csv
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'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/
먼저 권장 합니다.
mysqldump: You must use option --tab with --fields-...
GRANT FILE ON *.* TO 'user1'@'localhost';
- stackoverflow.com/a/15014385/1707015 . 내 경우에는 내가 가져 가야했다 /var/lib/mysql-files/
(대신 /tmp/
777에 권리를 MySQL과 설정 : -) MySQL의에 대한 사용자 설정 stackoverflow.com/a/32737616/1707015을 .
여기에 가장 간단한 명령이 있습니다.
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을 설정할 수 없다는 것에 대해 전혀 걱정하지 않습니다.
csv / tsv 실패와 같은 깨지기 쉬운 형식을 기반으로하는 사용자 지정 백업 / 복원에 대해 훨씬 더 걱정됩니다. 데이터에있는 모든 따옴표, 쉼표 또는 탭이 올바르게 이스케이프 된 다음 복원 도구에서 올바르게 구문 분석 될 것입니까?
데이터를 추출하는 방법을 찾고 있다면 다른 답변에서 여러 가지를 참조하십시오.
아래 스크립트를 사용하여 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을 처리합니다.
--skip-column-names
mysql의 내 버전에서도 말해야 합니다
항상 유용한 maatkit 도구 모음의 일부인 mk-parallel-dump 를 확인하십시오 . --csv 옵션을 사용하여 쉼표로 구분 된 파일을 덤프 할 수 있습니다.
이렇게하면 개별 테이블을 지정하지 않고도 전체 DB를 수행 할 수 있으며 백업 세트 테이블에 테이블 그룹을 지정할 수 있습니다.
또한 테이블 정의,보기 및 트리거를 별도의 파일로 덤프합니다. 보다 보편적으로 액세스 할 수있는 형태로 완전한 백업을 제공 할뿐만 아니라 mk-parallel-restore를 사용 하여 즉시 복원 할 수도 있습니다.
maatkit
percona toolkit
지금의 일부인 것 같지만 해당 도구를 찾을 수 없습니다.
전체 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