source

Amazon RDS에서 CSV 파일로 테이블 내보내기

itover 2022. 11. 22. 21:29
반응형

Amazon RDS에서 CSV 파일로 테이블 내보내기

Amazon RDS에서 MySQL 데이터베이스를 실행하고 있는데 전체 테이블을 CSV 형식으로 내보내는 방법을 알고 싶습니다.

현재 Windows의 MySQL 서버를 사용하여 Amazon 데이터베이스를 조회하고 있습니다만, 아마 Amazon RDS 전용 파일 서버가 없기 때문에 export를 실행하려고 하면 오류가 발생하는데, 이에 대한 해결 방법이 있습니까?

아마 Amazon RDS 데이터베이스로부터의 export를 시도하고 있을 것입니다.SELECT ... INTO OUTFILE쿼리에서는 실제로 자주 발생하는 문제가 발생합니다.예를 들어 CSV로 데이터베이스 내보내기 등을 참조하십시오.각각의 AWS 팀 응답은 서버 액세스 부족에 대한 가정을 확인하고 MySQL 명령줄 클라이언트에서 데이터를 선택하고 출력을 CSV로 다시 포맷하여 다음과 같이 CSV 형식으로 데이터를 내보내는 대체 접근 방식을 제안합니다.

mysql -u username -p --database=dbname --host=rdshostname --port=rdsport --batch
  -e "select * from yourtable"
  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > yourlocalfilename

사용자 fpalero는 필드를 미리 알고 지정할 경우 대체적이고 단순한 접근 방식을 제공합니다.

mysql -uroot -ppassword --database=dbtest
  -e "select concat(field1,',',field2,',',field3) FROM tabletest" > tabletest.csv

우선 Steffen의 답변은 대부분의 경우에 효과가 있습니다.

저는 최근에 "sed"로는 충분하지 않은 더 크고 복잡한 출력을 접했고, 정확히 이를 위한 간단한 유틸리티를 개발하기로 결정했습니다.

MySQL CLI 출력을 해석할 수 있는 sql2csv라는 모듈을 만듭니다.

$ mysql my_db -e "SELECT * FROM some_mysql_table" 

+----+----------+-------------+---------------------+
| id | some_int | some_str    | some_date           |
+----+----------+-------------+---------------------+
|  1 |       12 | hello world | 2018-12-01 12:23:12 |
|  2 |       15 | hello       | 2018-12-05 12:18:12 |
|  3 |       18 | world       | 2018-12-08 12:17:12 |
+----+----------+-------------+---------------------+

$ mysql my_db -e "SELECT * FROM some_mysql_table" | sql2csv
 
id,some_int,some_str,some_date
1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12

내장 CLI 를 사용할 수도 있습니다.

sql2csv -u root -p "secret" -d my_db --query "SELECT * FROM some_mysql_table;"

1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12

sql2csv(GitHub)에 대한 자세한 내용은 를 참조하십시오.

RDS의 MySQL을 가정할 경우, 다른 방법으로는 TAB로 구분된 값을 출력하고 줄 바꿈, 탭 및 기타 특수 문자를 이스케이프하는 배치 모드를 사용할 수 있습니다.아직 Tab으로 구분된 데이터를 처리할 수 없는 CSV Import 툴을 실행하지 않았습니다.예를 들어 다음과 같습니다.

$ mysql -h myhost.rds.amazonaws.com -u user -D my_database -p --batch --quick -e "SELECT * FROM my_table" > output.csv

Halfgaar가 지적한 바와 같이--quick옵션은 즉시 플러시되므로 큰 테이블의 메모리 부족 오류를 방지할 수 있습니다.문자열(권장)을 인용하려면 쿼리에서 추가 작업을 수행해야 합니다.

SELECT id, CONCAT('"', REPLACE(text_column, '"', '""'), '"'), float_column
  FROM my_table

REPLACE에 있는 이중 문자는 모두 제외됩니다.text_column가치.또한 datetime 필드에는 iso8601 문자열을 사용하는 것이 좋습니다.그러면 다음과 같습니다.

SELECT CONCAT('"', DATE_FORMAT(datetime_column, '%Y%m%dT%T'), '"') FROM my_table

컬럼 값이 NULL인 경우 CONCAT는 NULL을 반환합니다.

꽤 큰 테이블에서 실행해 봤는데 성능이 괜찮네요.RDS 인스턴스와 동일한 VPC에서 MySQL 명령을 실행할 때 600M 행과 23GB의 데이터가 소요되었습니다.

AWS의 새로운 방법이 있습니다.DMS(데이터베이스 이행 서비스)를 사용하면 됩니다.

다음은 테이블을 S3 스토리지 상의 파일로 내보내는 방법에 대한 문서입니다.AWS 데이터베이스 마이그레이션 서비스의 대상으로 Amazon S3 사용 - AWS 데이터베이스 마이그레이션 서비스

CSV 또는 Parquet의 가지 형식으로 내보낼 수 있습니다.

RDS MySQL에 접속하는 EC2의 Yii 프레임워크를 사용하고 있습니다.중요한 것은 fputcsv()를 사용하는 것입니다.다음은 제 로컬 호스트에서도 프로덕션에서도 완벽하게 작동합니다.

$file = 'path/to/filename.csv';
$export_csv = "SELECT * FROM table";

$qry = Yii::app()->db->createCommand($export_csv)->queryAll();

$fh = fopen($file, "w+");
foreach ($qry as $row) {
    fputcsv($fh, $row, ',' , '"');
}
fclose($fh);

Steffen Opel 솔루션을 사용하면 'concat' 문자열 리터럴을 포함하는 헤더가 생성됩니다.분명히 이건 네가 원하는 게 아니야.대부분의 경우 데이터의 해당 헤더가 필요합니다.

이 쿼리는 열 이름과 테이블 이름을 대체하는 것 외에 수정 없이 작동합니다.

mysql -h xxx.xxx.us-east-2.rds.amazonaws.com 
--database=mydb -u admin -p 
-e "SELECT 'column1','column2' 
UNION ALL SELECT column1,column2 
FROM table_name WHERE condition = value" > dataset.csv

방금 Numbers OS X 앱에서 결과를 열었는데 출력이 완벽해 보입니다.

언급URL : https://stackoverflow.com/questions/9536224/exporting-a-table-from-amazon-rds-into-a-csv-file

반응형