{Aurora}Amazon S3 バケットを使用した MySQL からのデータ移行

https://tech.drecom.co.jp/how-to-migrate-to-aws/
https://aws.amazon.com/jp/premiumsupport/knowledge-center/migrate-mysql-aurora-innobackup/

 

外部MySQL→EC2(Amazon Linux 2)に作成したMySQL 5.7
バックアップファイルの暗号化→なし
データレプリケーション時のSSL→使用しない

※ユーザやストアドプログラムは別途移行が必要

 

-- 1.MySQLインストール

 

sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community

sudo yum info mysql-community-server

sudo yum -y install mysql-community-server

sudo mysqld --version

sudo systemctl enable mysqld.service
sudo systemctl restart mysqld.service
sudo systemctl status mysqld.service

sudo cat /var/log/mysqld.log | grep password

sudo mysql_secure_installation


-- 初期設定

sudo vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
character_set_server=utf8mb4

 

-- 2.テストデータ作成
テーブル、ファンクション、プロシージャ、ユーザ

mysql -u root -p

drop database test;
create database test;
use test;
drop table tab1;
create table tab1(col1 int);
insert into tab1 values(1);
select * from tab1;

show create table tab1;

drop function func1;

delimiter //
create function func1()
returns int
deterministic
begin
return 0;
end//
delimiter ;


show create function func1\G


drop procedure proc1;

delimiter //
create procedure proc1()
begin
select 1;
end//
delimiter ;

show create procedure proc1\G

drop user user1@localhost;
create user user1@localhost identified by 'password';
select user,host from mysql.user;


-- 3.Percona XtraBackup のインストール

sudo yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum -y install perl-DBD-MySQL
sudo yum -y install percona-xtrabackup-24
xtrabackup --version

 

-- 4.S3バケット作成

aws s3 mb s3://bucket123
aws s3 ls

-- 5.IAM サービスロールの作成

-- ポリシーの作成
※マニュアルの記載と異なり、"s3:GetBucketLocation"が必要


vim policy01.json

 

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::bucket123"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket123/*"
]
}
]
}

 

aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json

 

-- ロールの作成
vim role01.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json


-- ポリシーをロールにアタッチ
aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy01 --role-name role01

※マニュアルの記載と異なり、クラスターパラメータグループでのaws_default_s3_roleの設定は不要

 

 

 

-- 6.Amazon Aurora MySQL DB クラスターとして復元するファイルのバックアップ

sudo mkdir -p /backup
sudo chown mysql:mysql /backup
sudo chmod 777 /backup

sudo -E xtrabackup --backup --user=root --host=localhost --password='password' --target-dir=/backup

 

 

-- 7.バックアップディレクトリおよびファイルを Amazon S3 バケットにコピー
sudo -E aws s3 cp /backup s3://bucket123 --recursive

aws s3 ls s3://bucket123


-- 8.Amazon S3 バケットからの Amazon Aurora MySQL DB クラスターの復元

aws rds restore-db-cluster-from-s3 \
--db-cluster-identifier cluster01 \
--engine aurora-mysql \
--master-username root \
--master-user-password 'password' \
--source-engine mysql \
--source-engine-version 5.7.35 \
--s3-bucket-name bucket123 \
--s3-ingestion-role-arn arn:aws:iam::999999999999:role/role01

 

aws rds create-db-instance \
--db-instance-identifier cluster01-instance01 \
--db-cluster-identifier cluster01 \
--db-instance-class db.t3.small \
--engine aurora-mysql

 


-- 9.Amazon Aurora MySQL DB クラスターと外部の MySQL データベースを同期する

aws rds describe-events


-- 外部DBで実行
host cluster01-instance01.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

インスタンスエンドポイントのIPを使用する

CREATE USER 'replication'@'172.31.333.333' IDENTIFIED BY 'password';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'replication'@'172.31.333.333';

select user,host from mysql.user;

外部 MySQL データベースをホストするサーバーとAurora MySQL DB クラスタ
それぞれのセキュリティグループの設定で双方向の全通信を許可する


-- Auroraで実行
CALL mysql.rds_set_external_master ( '172.31.444.444' , 3306 , 'replication' , 'password' , 'mysql-bin.000001' , 1234 , 0 );

CALL mysql.rds_start_replication;

SHOW SLAVE STATUS\G

CALL mysql.rds_stop_replication;

 


-- 10.クリーンアップ

-- ロールの一覧
aws iam list-roles | grep role01

-- ロールの削除

aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::999999999999:policy/policy01


aws iam delete-role --role-name role01

-- ポリシーの一覧
aws iam list-policies | grep policy01

-- ポリシーの削除
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01

-- バケット一覧
aws s3 ls

-- バケット削除
aws s3 rb s3://bucket123 --force