web-dev-qa-db-ja.com

複数のデータベースを新しいサーバーに移動する最速の方法

私はいくつかの中小規模のmysqlデータベース、たとえば約40を持っており、異なるcpanelアカウントを持つ1つのwhmサーバーから、以前のサーバーからセットアップされたアカウントとすでに移動している古いバージョンのデータベースを持つ別のサーバーに移行する必要があります場所。

誰かがこれを行う最も速い方法をお勧めできますか?私はそれぞれを手動でダンプしてインポートするつもりでしたが、非常に時間がかかるようです。可能であれば仲介者として自分のマシンを切り取り、可能な限り自動化したいと思います。

4
Toby

私はcPanelについてあまり知りませんが、データベースを別のサーバーに非常に高速に転送する方法を知っています-sshにアクセスできる場合。

適切なパラメーターを指定してmysqldumpを使用し、sshでチェーンします。したがって、データベースはインポートされますが、ソースデータベースはまだエクスポートされます。一時ファイルは使用されません(内部のmysqlを除く;))

sourceserver#mysqldump --user = user1 --all-databases | ssh targethost'mysql --user = user2 '

秘密鍵とssh-agentを使用してソースサーバーに認証する場合は、sshの-Aオプションを使用して接続できます。したがって、ターゲット側の承認について気にする必要はありません。ただし、次の点に注意してください。

         Agent forwarding should be enabled with caution.  Users with the
         ability to bypass file permissions on the remote Host (for the
         agent's Unix-domain socket) can access the local agent through
         the forwarded connection.  An attacker cannot obtain key material
         from the agent, however they can perform operations on the keys
         that enable them to authenticate using the identities loaded into
         the agent.

(出典:man 1 ssh)

これが少し役立つことを願っています

8
krissi

@krissiの回答が非常にうまく機能するので、おそらく少し多すぎますが、複数回実行する必要がある場合に備えて、次のようなスクリプトを使用できます。

#!/bin/bash
# MySQL databases migration script
# Jorge Barnaby (jorge {dot} barnaby {at} gmail)

################################################################################
# Configuration variables

ORIG_USER="Origin-username"
ORIG_PASS="Origin-password"
ORIG_Host="Origin-server"

DEST_USER="destination-username"
DEST_PASS="destination-password"
DEST_Host="destination-server"

# Do not backup the following databases
IGNORED_DBS="information_schema"

################################################################################
# Start of the program

# Command that runs on the Origin server to extract the databases
MYSQL_ORIG="mysqldump -u $ORIG_USER -h $ORIG_Host -p$ORIG_PASS --add-drop-database --databases"

# Command that runs on the destination server to popuplate the databases
MYSQL_DEST="mysql -u $DEST_USER -h $DEST_Host -p$DEST_PASS"

# Get all database list first
DBS="$(mysql -u $ORIG_USER -h $ORIG_Host -p$ORIG_PASS -Bse 'show databases')"

echo
echo -----------------------------------------------------------
echo `date +"%F %T %Z"` : Starting MySQL Migration script
echo -----------------------------------------------------------
echo
echo -- MySQL Origin Server: $ORIG_Host
echo -- MySQL Destination Server: $DEST_Host

for db in $DBS
do
    skipdb=-1
    if [ "$IGNORED_DBS" != "" ];
    then
        for i in $IGNORED_DBS
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi

    if [ "$skipdb" == "-1" ];
    then
        echo
        echo -- `date +"%F %T %Z"` : Migrating database $db
        # Command to be executed piping mysqldump on the Origin and mysql on the remote
        $MYSQL_ORIG $db | $MYSQL_DEST
        echo -- `date +"%F %T %Z"` : Done
    fi
done

echo
echo -----------------------------------------------------------
echo `date +"%F %T %Z"` : All Done
echo -----------------------------------------------------------

exit 0
2
yorch