Aurora MySQL クラスター間のレプリケーション

同一リージョン内で Aurora クラスターを作り直すため、MySQL 標準のレプリケーション機能を使って移行する。

参考

手順

  1. レプリケーション元 Aurora クラスターのクラスターパラメーターで、バイナリログを有効化する。

    shell DB_CLUSTER_PARAMETER_GROUP_NAME=ciaocamera-test-camdb-camdbclusterparametergroup-tsy9z9tr7841 aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name "${DB_CLUSTER_PARAMETER_GROUP_NAME}" \ --parameters "ParameterName=binlog_format,ParameterValue=MIXED,ApplyMethod=pending-reboot"

    確認

    shell $ aws rds describe-db-cluster-parameters \ --db-cluster-parameter-group-name "${DB_CLUSTER_PARAMETER_GROUP_NAME}" \ | jq -r '.Parameters[] | select(.ParameterName == "binlog_format") | .ParameterValue' MIXED

    設定変更を反映するため、インスタンスの再起動をおこなう。

    shell DB_INSTANCE_IDENTIFIER=cc1f9fpwkwcn39x aws rds reboot-db-instance --db-instance-identifier ${DB_INSTANCE_IDENTIFIER}

    バイナリログのファイル名と場所を確認する。

    shell $ SOURCE_DB_HOST=ciaocamera-test-camdb-camdbcluster-1ge2ln1kxr6iq.cluster-ce5bbgu32bs2.ap-northeast-1.rds.amazonaws.com $ SOURCE_DB_PORT=56306 $ SOURCE_DB_USERNAME=ciao $ SOURCE_DB_PASSWORD=cc-pw.2020 $ mysql -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \ -e "SHOW MASTER STATUS;" +----------------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------------+----------+--------------+------------------+-------------------+ | mysql-bin-changelog.000026 | 120 | | | | +----------------------------+----------+--------------+------------------+-------------------+

  2. レプリケーション元 Aurora クラスターのスナップショットを取得する。

  3. スナップショットからクラスターを起動する。

  4. レプレイケーション先 Aurora クラスターのマスターインスタンスのイベントから、

    shell $ DB_IDENTIFIER=cceo0kvxb9rsjr $ aws rds describe-events --source-type db-instance --source-identifier "${DB_IDENTIFIER}" \ | jq -r '.Events[] | .Date + "\t" + .Message'

CALL mysql.rds_set_configuration('binlog retention hours', 144);

レプリカソースにレプリケーション用のユーザーを作成する。

$ REPL_USERNAME=repl
$ REPL_PASSWORD=repl-pw.2020
$ mysql -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    -e "
        CREATE USER '${REPL_USERNAME}'@'10.0.0.0/255.255.255.0' IDENTIFIED BY '${REPL_PASSWORD}';
        GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO '${REPL_USERNAME}'@'10.0.0.0/255.255.255.0';
        GRANT USAGE ON *.* TO '${REPL_USERNAME}'@'10.0.0.0/255.255.255.0' REQUIRE SSL;
    "
$ mysql -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    -e "SELECT user, host FROM mysql.user;"

レプリケーションを有効化する。

$ TARGET_DB_HOST=ciaocamera-test-camdb-2-camdbcluster-1273n8c5k2o8r.cluster-ce5bbgu32bs2.ap-northeast-1.rds.amazonaws.com
$ TARGET_DB_PORT=56306
$ TARGET_DB_USERNAME=ciao
$ TARGET_DB_PASSWORD=cc-pw.2020
$ BINLOG_FILENAME=mysql-bin-changelog.000005
$ BINLOG_POSITION=120
$ mysql -h "${TARGET_DB_HOST}" -P "${TARGET_DB_PORT}" -u "${TARGET_DB_USERNAME}" -p"${TARGET_DB_PASSWORD}" \
    -e "
        CALL mysql.rds_set_external_master ('${SOURCE_DB_HOST}', ${SOURCE_DB_PORT}, '${REPL_USERNAME}', '${REPL_PASSWORD}', '${BINLOG_FILENAME}', ${BINLOG_POSITION}, 0);
        CALL mysql.rds_start_replication;
    "

確認

$ 
mysql -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    -e "SHOW SLAVE STATUS;"
$ mysql -h "${TARGET_DB_HOST}" -P "${TARGET_DB_PORT}" -u "${TARGET_DB_USERNAME}" -p"${TARGET_DB_PASSWORD}" \
    -e "SHOW SLAVE STATUS;"

MEMO

$ mysql -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    -e "DROP USER '${REPL_USERNAME}'@'10.0.0.0/255.255.255.0';"
$ 
$ mysql -h "${TARGET_DB_HOST}" -P "${TARGET_DB_PORT}" -u "${TARGET_DB_USERNAME}" -p"${TARGET_DB_PASSWORD}" \
    -e "SELECT user, host FROM mysql.user;"
$ mysql -h "${TARGET_DB_HOST}" -P "${TARGET_DB_PORT}" -u "repl_user" -p"repl-pw.2020" \
    -e "STOP SLAVE;"

$ mysqldump -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \ --skip-column-statistics --master-data --single-transaction \ --all-databases > all.dump

全データベース

$ mysqldump -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    --skip-column-statistics \
    --all-databases > all.dump

本番データベース

$ SOURCE_DB_HOST=ciaocam-db-20180102-cluster.cluster-cgbyhhzybdlu.ap-northeast-1.rds.amazonaws.com
$ SOURCE_DB_PORT=56306
$ SOURCE_DB_USERNAME=ciao
$ SOURCE_DB_PASSWORD=14-fnRco
$ mysqldump -h "${SOURCE_DB_HOST}" -P "${SOURCE_DB_PORT}" -u "${SOURCE_DB_USERNAME}" -p"${SOURCE_DB_PASSWORD}" \
    --skip-column-statistics --master-data --single-transaction \
    --all-databases > all.dump

https://qiita.com/kenjiszk/items/dbfecccb522cb1306c1f