sql >> データベース >  >> RDS >> MariaDB

Amazon RDS(MySQLまたはMariaDB)をオンプレミスサーバーに移行する

    アマゾンウェブサービスは、特に最先端のクラウドコンピューティングサービスの先駆者となると、テクノロジーの巨人です。そのフルマネージドサービス製品(Amazon RDS)は他に類を見ないものです。繰り返しになりますが、一部の組織にとっては完璧なプラットフォームになる可能性がありますが、そうでない場合は、そこから脱却するのは難しい場合があります。ベンダーロックインの状況で立ち往生する懸念は常にあります。

    RDSからオンプレミスプラットフォームに移行する際に留意すべき点は、予算の制約、セキュリティ、およびデータの自律性です。これは、データが最も価値のある資産であり、データがどこにあっても制御を維持するため、組織と企業が常に競争力を維持することが常に不可欠であるためです。クラウドをロックインする余裕のある組織はありませんが、多くの企業はまさにその状況にあり、オンプレミスで運用できる代替の既存のソリューションを探し始めています。

    このブログでは、AmazonRDSからオンプレミスサーバーに移行する方法について説明します。オンプレミスサーバー上のターゲットデータベースはRHEL/CentOS Linuxサーバー上にありますが、パッケージが適切にインストールされている限り、該当する手順は他のバージョンのLinuxにも適用されます。

    データ移行を提供するサードパーティの既存のソリューションがいくつかありますが、オンプレミスプラットフォームには適用できません。さらに、それは無料ではなく、オープンソースソリューションで無料を使用して移行することは常に有利で有利です。保証とサポートはオープンソーステクノロジーに拘束されていないため、疑問や懸念もありますが、ここでは簡単な手順でこれを実現する方法を紹介します。

    AmazonRDSはMySQLおよびMariaDBとの互換性をサポートしているため。このブログではそれらに焦点を当てます。

    MySQLまたはMariaDB用のAmazonRDSからの移行

    Amazon RDSからオンプレミスサーバーにデータを移行する一般的なアプローチは、論理コピーを使用してバックアップを取ることです。これは、フルマネージドサービスであるAmazonRDSと互換性のあるバックアップユーティリティソリューションを使用して実行できます。フルマネージドデータベースサービスはSSHログインを提供しないため、バックアップの物理コピーはオプションではありません。

    mysqldumpの使用

    mysqldumpの使用は、オンプレミスにあるターゲットデータベースノードにインストールする必要があります。 AWS RDSノードのレプリカとして準備する必要があるため、後続のすべてのトランザクションはノードに複製されます。これを行うには、以下の手順に従います。

    AWSRDSソースホスト :database-1.xxxxxxx.us-east-2.rds.amazonaws.com

    オンプレミスサーバーホスト :192.168.10.226(testnode26)

    ダンプを開始する前に、binlogの保持時間が設定されていることを確認してください。これを設定するには、AmazonRDSインスタンスで以下のプロシージャコールの例のように行うことができます

    mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
    
    Query OK, 2 rows affected (0.23 sec)
    
    
    
    mysql> CALL mysql.rds_show_configuration;
    
    +------------------------+-------+------------------------------------------------------------------------------------------------------+
    
    | name                   | value | description                                                                                          |
    
    +------------------------+-------+------------------------------------------------------------------------------------------------------+
    
    | binlog retention hours | 24    | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |
    
    +------------------------+-------+------------------------------------------------------------------------------------------------------+
    
    1 row in set (0.23 sec)
    
    
    
    Query OK, 0 rows affected (0.23 sec)

    mysqldumpをインストールします

    1. リポジトリを準備します。

    #MySQLの場合

    $ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

    #MariaDBの場合

    $ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
    1. mysql-clientパッケージをインストール

    #MySQLの場合

    $ yum install -y mysql-community-client.x86_64

    #MariaDBの場合

    $ yum install -y MariaDB-client
    1. mysqldumpを使用して、ターゲットノード内で実行することによりデータダンプを作成します。オプションとして--master-data=2を指定すると、これはMariaDBでのみ機能し、MySQLでは機能しないことに注意してください。したがって、MySQLの追加作業を行う必要があります。これについては後で説明します。

    ##MariaDBアプローチに適用可能

    [[email protected] ~]# mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --master-data=2 --databases db1 db2 db3  > backups/dump.sql
    
    Enter password:
    
    [[email protected] ~]# ls -alth backups/dump.sql
    
    -rw-r--r--. 1 root root 196M Oct 18 02:34 backups/dump.sql
    1. MySQL/MariaDBサーバーをターゲットデータベースノードにインストールします

    #MySQLの場合(yumリポジトリで有効になっているバージョンリポジトリを常に確認してください。この時点では、MySQL 5.7を使用しています)

    $ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server

    #MariaDBの場合

    $ yum install MariaDB-server.x86_64
    1. MySQL / MariaDBサーバーインスタンス(my.cnf、ファイル権限、ディレクトリ)をセットアップし、サーバーを起動します。

    #my.cnfの設定(ClusterControlによるmy.cnfデプロイメントの使用を使用)

    [MYSQLD]
    
    user=mysql
    
    basedir=/usr/
    
    datadir=/var/lib/mysql
    
    socket=/var/lib/mysql/mysql.sock
    
    pid_file=/var/lib/mysql/mysql.pid
    
    port=3306
    
    log_error=/var/log/mysql/mysqld.log
    
    log_warnings=2
    
    slow_query_log_file=/var/log/mysql/mysql-slow.log
    
    long_query_time=2
    
    slow_query_log=OFF
    
    log_queries_not_using_indexes=OFF
    
    innodb_buffer_pool_size=2G
    
    innodb_flush_log_at_trx_commit=2
    
    innodb_file_per_table=1
    
    innodb_data_file_path=ibdata1:100M:autoextend
    
    innodb_read_io_threads=4
    
    innodb_write_io_threads=4
    
    innodb_doublewrite=1
    
    innodb_log_file_size=256M
    
    innodb_log_buffer_size=32M
    
    innodb_buffer_pool_instances=1
    
    innodb_log_files_in_group=2
    
    innodb_thread_concurrency=0
    
    innodb_flush_method=O_DIRECT
    
    innodb_rollback_on_timeout=ON
    
    innodb_autoinc_lock_mode=2
    
    innodb_stats_on_metadata=0
    
    default_storage_engine=innodb
    
    server_id=1126
    
    binlog_format=ROW
    
    log_bin=binlog
    
    log_slave_updates=1
    
    relay_log=relay-bin
    
    expire_logs_days=7
    
    read_only=OFF
    
    report_host=192.168.10.226
    
    key_buffer_size=24M
    
    tmp_table_size=64M
    
    max_heap_table_size=64M
    
    max_allowed_packet=512M
    
    skip_name_resolve=true
    
    memlock=0
    
    sysdate_is_now=1
    
    max_connections=500
    
    thread_cache_size=512
    
    query_cache_type=0
    
    query_cache_size=0
    
    table_open_cache=1024
    
    lower_case_table_names=0
    
    performance_schema=OFF
    
    performance-schema-max-mutex-classes=0
    
    performance-schema-max-mutex-instances=0
    
    
    
    [MYSQL]
    
    socket=/var/lib/mysql/mysql.sock
    
    
    
    [client]
    
    socket=/var/lib/mysql/mysql.sock
    
    
    
    [mysqldump]
    
    socket=/var/lib/mysql/mysql.sock
    
    max_allowed_packet=512M

    ##データディレクトリをリセットし、データベースシステムファイルを再インストールします

    $ rm -rf /var/lib/mysql/*

    ##ログディレクトリを作成します

    $ mkdir /var/log/mysql
    
    $ chown -R mysql.mysql /var/log/mysql

    ##MySQLの場合

    $ mysqld --initialize

    ##MariaDBの場合

    $ mysql_install_db

    1. MySQL/MariaDBサーバーを起動します

    ##MySQLの場合

    $ systemctl start mysqld

    ##MariaDBの場合

    $ systemctl start mariadb
    1. AWSRDSから取得したデータダンプをオンプレミスのターゲットデータベースノードにロードします

    $ mysql --show-warnings < backups/dump.sql
    1. AWSRDSソースノードからレプリケーションユーザーを作成します

    MariaDB [(none)]> CREATE USER 'repl_user'@'149.145.213.%' IDENTIFIED BY 'repl_passw0rd';
    
    Query OK, 0 rows affected (0.242 sec)
    
    
    
    MariaDB [(none)]>  GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl_user'@'149.145.213.%'  IDENTIFIED BY 'repl_passw0rd' ;
    
    Query OK, 0 rows affected (0.229 sec)
    1. MySQL/MariaDBサーバーをAWSRDSソースノードのレプリカ/スレーブとして設定

    ##まず、CHANGEMASTERコマンドを検索または検索しましょう

    [[email protected] ~]# grep -rn -E -i 'change master to master' backups/dump.sql |head -1
    
    22:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421;

    ## CHANGE MASTERステートメントを実行しますが、レプリケーションのユーザー/パスワードとホスト名を次のように追加します。

    MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='database-1.xxxxxxx.us-east-2.rds.amazonaws.com', MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421, MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd';
    
    Query OK, 0 rows affected (0.004 sec)

    ##次にスレーブスレッドを開始します

    MariaDB [(none)]> START SLAVE;
    
    Query OK, 0 rows affected (0.001 sec)

    ##スレーブのステータスを確認してください

    MariaDB [(none)]> SHOW SLAVE STATUS \G
    
    *************************** 1. row ***************************
    
                    Slave_IO_State: Waiting for master to send event
    
                       Master_Host: database-1.xxxxxxx.us-east-2.rds.amazonaws.com
    
                       Master_User: repl_user
    
                       Master_Port: 3306
    
                     Connect_Retry: 60
    
                   Master_Log_File: mysql-bin-changelog.000584
    
               Read_Master_Log_Pos: 421
    
                    Relay_Log_File: relay-bin.000001
    
                     Relay_Log_Pos: 4
    
             Relay_Master_Log_File: mysql-bin-changelog.000584
    
                  Slave_IO_Running: Yes
    
                 Slave_SQL_Running: Yes
    
                   Replicate_Do_DB:
    
               Replicate_Ignore_DB:
    
                Replicate_Do_Table:
    
            Replicate_Ignore_Table:
    
           Replicate_Wild_Do_Table:
    
       Replicate_Wild_Ignore_Table:
    
                        Last_Errno: 0
    
                        Last_Error:
    
                      Skip_Counter: 0
    
               Exec_Master_Log_Pos: 421
    
                   Relay_Log_Space: 256
    
                   Until_Condition: None
    
                    Until_Log_File:
    
                     Until_Log_Pos: 0
    
                Master_SSL_Allowed: No
    
                Master_SSL_CA_File:
    
                Master_SSL_CA_Path:
    
                   Master_SSL_Cert:
    
                 Master_SSL_Cipher:
    
                    Master_SSL_Key:
    
             Seconds_Behind_Master: 0
    
     Master_SSL_Verify_Server_Cert: No
    
                     Last_IO_Errno: 0
    
                     Last_IO_Error:
    
                    Last_SQL_Errno: 0
    
                    Last_SQL_Error:
    
       Replicate_Ignore_Server_Ids:
    
                  Master_Server_Id: 1675507089
    
                    Master_SSL_Crl:
    
                Master_SSL_Crlpath:
    
                        Using_Gtid: No
    
                       Gtid_IO_Pos:
    
           Replicate_Do_Domain_Ids:
    
       Replicate_Ignore_Domain_Ids:
    
                     Parallel_Mode: optimistic
    
                         SQL_Delay: 0
    
               SQL_Remaining_Delay: NULL
    
           Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
    
                  Slave_DDL_Groups: 0
    
    Slave_Non_Transactional_Groups: 0
    
        Slave_Transactional_Groups: 0
    
    1 row in set (0.000 sec)

    これで、オンプレミスにあるレプリカのソースまたはマスターとしてRDSからようやく複製できるようになりました。まだ終わっていません。

    などのレプリケーションエラーが発生する場合があります。
    Last_SQL_Errno: 1146
    
                    Last_SQL_Error: Error 'Table 'mysql.rds_heartbeat2' doesn't exist' on query. Default database: 'mysql'. Query: 'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1602988485784) ON DUPLICATE KEY UPDATE value = 1602988485784'

    on-premは、「rds%」というプレフィックスが付いたテーブルのmysqlデータベースからのデータを複製する必要がないため、複製中はこれらのテーブルを無視します。さらに、AWSRDSでmysql.userテーブルを更新および変更したくない場合があります。これを行うには、オプションでスキーマを無視するか、

    などのテーブルのリストだけを無視することができます。
    STOP SLAVE;

    次に、

    SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
    または

    SET GLOBAL replicate_wild_ignore_table='mysql.%';

    --master-data=2に関するMySQLの問題

    --master-data =2を指定してmysqldumpを取得するには、SUPERおよびRELOAD特権を必要とする十分な特権が必要です。問題は、AWSRDSがデータベースのセットアップおよび作成中に管理ユーザーにこれを提供しないことです。この問題を回避するには、AWSRDSにマスターとレプリカまたはスレーブのセットアップがある必要があります。スレーブを設定したら、mysqldumpを使用するときにそれをターゲットソースホストとして使用します。次に、次のようにAWSRDSレプリカからスレーブスレッドを停止します。

    rds-replica-mysql> CALL mysql.rds_stop_replication;

    次に、以下のように--master-dataオプションを指定せずにmysqldumpを取得します。

    mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3  > backups/dump.sql

    次に、AWSRDSレプリカからSHOWSLAVE STATUS \ Gを実行し、オンプレミスサーバーに複製するAWSRDSマスターに接続するときに使用するMaster_Log_FileとExec_Master_Log_Posをメモします。 CHANGEMASTERTO…MASTER_LOG_FILE=Master_Log_File、MASTER_LOG_POS =を実行するときに、これらの座標を使用します。もちろん、バックアップが完了したら、RDSレプリカを開始して、レプリケーションスレッドを再開することを忘れないでください。

    rds-replica-mysql> CALL mysql.rds_start_replication;

    mydumperの使用

    mydumperは、ソースRDSノードからデータセットのダンプまたはバックアップコピーを取得するときに並列処理と速度を提供するため、特にデータセットが非常に大きい場合に、ここでの代替オプションになります。 mydumperのインストールから、宛先のオンプレミスサーバーへのロードまで、以下の手順に従ってください。

    1. バイナリをインストールします。バイナリはここhttps://github.com/maxbube/mydumper/releasesにあります。

     $ yum install https://github.com/maxbube/mydumper/releases/download/v0.9.5/mydumper-0.9.5-2.el6.x86_64.rpm
    1. RDSソースノードからバックアップを取ります。たとえば、

    [[email protected] mydumper-2]# /usr/bin/mydumper --outputdir=. --verbose=3 --host=database-1.xxxxxxx.us-east-2.rds.amazonaws.com --port=3306 --kill-long-queries --chunk-filesize=5120 --build-empty-files --events --routines --triggers --compress --less-locking --success-on-1146 --regex='(db1\.|db2\.|db3\.|mydb4\.|testdb5\.)' -u admin --password=admin123
    
    ** Message: Connected to a MySQL server
    
    
    
    ** (mydumper:18904): CRITICAL **: Couldn't acquire global lock, snapshots will not be consistent: Access denied for user 'admin'@'%' (using password: YES)
    
    ** Message: Started dump at: 2020-10-18 09:34:08
    
    
    
    ** Message: Written master status
    
    ** Message: Multisource slave detected.
    
    ** Message: Thread 5 connected using MySQL connection ID 1109

    この時点で、mydumperは*.gzファイルの形式でバックアップファイルを取得します

    1. 宛先のオンプレミスサーバーにロードします

    $ myloader --host localhost --directory=$(pwd) --queries-per-transaction=10000 --threads=8 --compress-protocol --verbose=3
    
    ** Message: 8 threads created
    
    ** Message: Creating database `db1`
    
    ** Message: Creating table `db1`.`folders_rel`
    
    ** Message: Creating table `db2`.`p`
    
    ** Message: Creating table `db2`.`t1`
    
    ** Message: Creating table `db3`.`AddressCodeTest`
    1. 宛先ノードをスレーブ/レプリカとして設定します。 mydumper will include a file called metadata which consists of binary log coordinates including GTID positions, for example:                                                                                                                                                                         

    $ cat metadata
    
    Started dump at: 2020-10-18 10:23:35
    
    SHOW MASTER STATUS:
    
            Log: mysql-bin-changelog.000680
    
            Pos: 676
    
            GTID:0-1675507089-3044

    ##次に、レプリカまたはターゲットの宛先MySQL/MariaDBデータベースノードから変更マスターを実行します

    MariaDB [jbmrcd_date]> CHANGE MASTER TO MASTER_HOST='database-1.cmu8qdlvkepg.us-east-2.rds.amazonaws.com', MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd',  MASTER_LOG_FILE='mysql-bin-changelog.000680', MASTER_LOG_POS
    
    =676;
    
    Query OK, 0 rows affected (0.002 sec)

    ##スレーブを起動します

    MariaDB [jbmrcd_date]> start slave;
    
    Query OK, 0 rows affected (0.001 sec)

    この時点で、MySQL/MariaDBを実行しているAmazonRDSインスタンスからレプリケートされています。アプリケーションをAmazonRDSインスタンスから移動する準備ができたら、オンプレミスサーバーに移動するエンドポイントをセットアップすると、RDSインスタンスからの残りのすべてのトランザクションがオンプレミスに複製され、オンプレミスにデータが失われることはありません。プレミスサーバー。

    データの不一致を確認する

    AWS RDSインスタンスからレプリカとして機能するオンプレミスサーバーにデータをロードまたはダンプしたら、チェックサム計算を実行してこれを再確認し、データがソースAmazonRDS。 Perconaのpt-table-checksumツールを使用することをお勧めしますが、md5やsha256などのチェックサムツールを使用して独自のツールを作成することもできますが、これには時間がかかります。さらに、pt-upgradeを使用すると、このレプリケーションアプローチを使用したデータ移行が完了した後にも役立ちます。

    結論

    mysqldumpまたはmydumperの使用は、無料のオープンソースツールです。これは、特にデータの機密性が高く、サードパーティにアクセスさせたくない場合にも大きな利点です。このアプローチを採用するのは簡単かもしれませんが、データの不整合なしに移行が完全に達成されたことを証明するために、テストとダブルチェックが常に続くため、面倒で大規模な作業が必要になる可能性があります。


    1. MySQLで数値をフォーマットする方法

    2. AWSRDSを使用したオンプレミスからクラウドへのPostgreSQLデータベースの移行

    3. Postgres 8.2で参照整合性を無効にするにはどうすればよいですか?

    4. OracleDatabaseでSETDEFINEOFFを使用する場合または使用する理由