2014-03-14 5 views
4

500Gb RDS 인스턴스의 모든 데이터베이스를 작은 인스턴스 (100Gb)로 덤프하려고합니다. mysql 테이블을 덤프해야하므로 많은 사용자 권한이 저장되어 있습니다. 지금은 나의 새로운 인스턴스에 데이터를 업로드 할 때임포트시 MySQL/Amazon RDS 오류

mysqldump -h hostname -u username -ppassword --all-databases > dump.sql 

나는 다음과 같은 오류 얻을 :

mysql -h hostname -u username -ppassword < dump.sql` 
ERROR 1044 (42000) at line 2245: Access denied for user 'staging'@'%' to database 'mysql' 

난 그냥 이러한 목표를 달성하기 위해 데이터베이스 스냅 숏을 사용,하지만 내 인스턴스는 크기가 작 .

온 전성 검사로 데이터를 원래 인스턴스로 덤프했지만 동일한 오류가 발생했습니다. 누군가 제가 여기서해야 할 일에 대해 조언을 해줄 수 있습니까? 감사!

답변

2

USE database; 문에 대한 줄 수를 찾으려면 grep을 사용하고 문제가있는 부분을 잘라내려면 아래에 나와있는 sed을 사용하여 데이터베이스를 개별적으로 수행하거나 기존 파일에서 mysql 스키마를 제거해야합니다.), MySQL 스키마에서 테이블 구조 나 독점적 인 RDS 트리거로 원숭이가 아닌 덤프 파일을 생성하십시오.

전체 mysql 스키마를 RDS 인스턴스로 복원하려고 시도하지는 않았지만 RDS의 사용자 지정 내용과 SUPER 권한이 부족한 곳을 확실히 볼 수 있습니다.하지만이 옵션은 다음과 같습니다 mysqldump는 적어도 당신을 가까이 가야한다. 이 여전히 너무 공격적이면

mysqldump --no-create-info  # don't try to drop and recreate the mysql schema tables 
      --skip-triggers  # RDS has proprietary triggers in the mysql schema 
      --insert-ignore  # write INSERT IGNORE statements to ignore duplicates 
      --databases mysql  # only one database, "mysql" 
      --skip-lock-tables # don't generate statements to LOCK TABLES/UNLOCK TABLES during restore 
      --single-transaction # to avoid locking up the source instance during the dump 

, 당신은 콘텐츠를 당신이 ("사용자"다른 그랜트 테이블)을 유지하기 위해 필요한 특정 테이블에서 행만을 덤핑에 의지해야합니다.

다음에 대한 보증은 없지만 내 컬렉션에 있습니다. "old_dumpfile.sql"을 읽고 "new_dumpfile.sql"을 쓰는 한 줄짜리예요 ... 같은 줄에 mys32를 사용하여 USE 또는 CREATE DATABASE 문을보고 다시 출력을 전환하는 한 줄입니다. mysql이 없으면 다음 번에 그러한 명령문이 발생합니다. 덤프 파일에 DROP DATABASE 문이 포함되어 있거나 --skip-add-drop-database으로 새 덤프 파일을 생성 할 수있는 경우 수정해야합니다.

이것을 통해 기존 덤프 파일을 실행하면 기본적으로 해당 파일에서 mysql 스키마 만 제거되므로 수동으로 먼저 복원 한 다음 나머지 데이터베이스 데이터가 더 원활하게 흐르게 할 수 있습니다.

perl -pe 'if (/(^USE\s|^CREATE\sDATABASE.*\s)`mysql`/) { $x = 1; } elsif (/^USE\s`/ || /^CREATE\sDATABASE/) { $x = 0; }; $_ = "" if $x;' old_dumpfile.sql > new_dumpfile.sql 
+0

답장을 보내 주셔서 감사합니다. 나는 여전히 오류를 범할 수 없었다. 나는 수동으로 가져 오기만 할 것입니다. –

+0

'DEFINER' 선언과 관련하여 RDS를 복원하는 동안 액세스가 거부되는 또 다른 일반적인 원인이 있습니다. (당연히 과소 평가 된 Perl은 그날의 영웅이었습니다. 다시 말하지만) http://serverfault.com/questions/555953/first- 시도 - 마이 그 레이션 - ec2 - mysql을 - 아마존 - rds - 잘 - 잘 - 슈퍼 - 특권/555983 # 555983 –

+1

헤이 @ 마이클 - sqlbot 그'펄 명령을 게시 주셔서 감사합니다, 그것은 나를 많이 구해 주셔서 감사합니다 작품 :) – Moe

1

workbench을 사용해보세요. 거기에 마이그레이션 기능이 있습니다. 먼저 작은 인스턴스 (100GB)를 만든 다음 해당 마이그레이션 기능을 사용하여 작동하는 경우 500GB에서 100GB로 마이그레이션하십시오.

1

RDS MySQL에 대한 액세스가 너무 많아서 액세스가 거부되었습니다. 그래서 RDS에 명령 아래 실행 내 출구입니다 :

GRANT ALL ON `%`.* to '<type_the_usernamne_here>'@'%'; 

나는 이것이 당신의 경우에 도움이 될지 잘 모르겠다. 그러나 그것은 항상 저를위한 구원자였습니다.

+0

고마워,하지만이 경우에는 작동하지 않습니다. –