dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

RDS for MySQLでMySQLアカウントを別のインスタンスにコピーする

RDSインスタンスの移行などでMySQLアカウントをパスワード、権限そのままコピーしたいことがある。

#!/bin/bash
set -euo pipefail

source .env
echo 'SELECT User, Host FROM mysql.user' | \
        mysql -uroot -p${OLD_DB_PASSWORD} -h ${OLD_DB_HOST} | \
        sed -E -e "/^User|root|mysql\.infoschema||mysql\.session|mysql\.sys|rdsrepladmin|rdsadmin\t/d" -e "s/^(.+)\t(.+)$/'\1'@'\2'/" -e "s/^(.+)$/SHOW CREATE USER \1;\nSHOW GRANTS FOR \1;/" | \
        mysql -uroot -p${OLD_DB_PASSWORD} -h ${OLD_DB_HOST} | \
        sed -E -e '/^CREATE\ USER\ for\ /d' -e '/^Grants\ for\ /d' -e 's/$/;/' | \
        mysql -uroot -p${NEW_DB_PASSWORD} -h ${NEW_DB_HOST}

.envはこのように用意しておく

OLD_DB_HOST='foo.ap-northeast-1.rds.amazonaws.com'
OLD_DB_PASSWORD='foo-password'

NEW_DB_HOST='bar.ap-northeast-1.rds.amazonaws.com'
NEW_DB_PASSWORD='bar-password'