source

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

bestscript 2022. 11. 1. 21:37

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

mysqldump는 mysql만 읽기 쉬운 형태로 출력되기 때문에 피하고 싶습니다.CSV는 범용성이 높은 것 같습니다(테이블당 1개의 파일로 충분합니다).하지만 mysqldump에 장점이 있다면, 나는 열심히 귀를 기울인다.또, 커맨드 라인(리눅스)에서 실행할 수 있는 것을 원합니다.만약 그것이 mysql 스크립트라면, 그러한 것을 만드는 방법에 대한 포인터가 도움이 될 것입니다.

할 수 바이너리가 를 합니다.-Bmysql명령어를 입력합니다.Excel 수 TSV 구분)할 수 .

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

또는 서버의 파일시스템에 직접 액세스할 수 있는 경우 를 사용하여 실제 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'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/ 번째

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을 셋업할 수 없기 때문에 restore를 할 수 없는 것은 전혀 걱정하지 않습니다.

csv/tsv 장애와 같은 취약한 형식에 기반한 맞춤형 백업/복원이 훨씬 더 걱정됩니다.데이터에 있는 모든 따옴표, 쉼표 또는 탭이 올바르게 이스케이프된 다음 복원 도구를 통해 올바르게 구문 분석됩니까?

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

다음 스크립트를 사용하여 출력을 csv 파일로 가져올 수 있습니다.테이블당 1개의 파일(헤더 포함)

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을 처리합니다.

전체 db를 csv로 덤프하는 경우

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://buckera/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

mk-parallel-dump는 항상 유용한 maatkit 도구 모음의 일부입니다.그러면 --csv 옵션을 사용하여 쉼표로 구분된 파일을 덤프할 수 있습니다.

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

또한 테이블 정의, 뷰 및 트리거를 별도의 파일로 덤프합니다.범용성이 뛰어난 형태로 완전한 백업을 제공할 뿐만 아니라 mk-parallel-restore를 통해 즉시 restore 가능

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= 탭 지정

모든 테이블을 탭으로 빠르게 구분하는 조금 더 간단한 방법이 있습니다.

#!/bin/bash
tablenames=$(mysql your_database -e "show tables;" -B |sed "1d")

IFS=$'\n'

tables=($tablenames)

for table in ${tables[@]}; do
        mysql your_database -e "select * from ${table}" -B > "${table}.tsv"
done

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