物理サーバー間でMySQLテーブルを移動するにはどうすればよいですか?
この正確なシナリオのように: innodbテーブルを使用し、サイズが約20GBのMySQLサーバーがあります。
新しいサーバーに移動したいのですが、これを行う最も効率的な方法は何ですか?
物理サーバー間でMySQLテーブルを移動するにはどうすればよいですか?
この正確なシナリオのように: innodbテーブルを使用し、サイズが約20GBのMySQLサーバーがあります。
新しいサーバーに移動したいのですが、これを行う最も効率的な方法は何ですか?
回答:
私のお気に入りの方法は、sqldumpコマンドをsqlコマンドにパイプすることです。すべてのデータベースまたは特定のデータベースを実行できます。したがって、たとえば、
mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword
ですべてのデータベースを実行できます
mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver
唯一の問題は、データベースが大きすぎてパイプが崩壊する場合です。その場合、テーブルごと、または以下で説明する他の方法のいずれかを実行できます。
netcat
。
私は最近、次の戦略で30GBのデータベースを移動しました。
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)tar -xzvf mysqldata.tar.gz
)MySQL 5.0 Certification Study Guideによると、第32章のセクション32.3.4、ページ456,457には、以下をもたらすバイナリポータビリティの条件が記載されています。
あるマシンで作成されたバイナリバックアップを取得し、異なるアーキテクチャを持つ別のマシンで使用する場合は、バイナリの移植性が重要です。たとえば、バイナリバックアップを使用することは、MySQLサーバーから別のMySQLサーバーにデータベースをコピーする1つの方法です。
MyISAMの場合、バイナリポータビリティとは、MyISAMテーブルのファイルを1つのMySQLサーバーから別のマシン上の別のサーバーに直接コピーでき、2番目のサーバーがテーブルにアクセスできることを意味します。
InnoDBのバイナリポータビリティとは、あるマシンのMySQLサーバーから別のマシンの別のサーバーにテーブルスペースファイルを直接コピーでき、2番目のサーバーがテーブルスペースにアクセスできることを意味します。デフォルトでは、サーバーが管理するすべてのInnoDBテーブルは一緒にテーブルスペースに格納されるため、テーブルスペースの移植性は、すべての個々のInnoDBテーブルが移植可能かどうかの関数です。1つのテーブルでも移植できない場合は、どちらもテーブルスペースではありません。
MyISAMテーブルとInnoDBテーブルスペースは、2つの条件が満たされている場合、ホスト間でバイナリポータブルです。
- 両方のマシンで2の補数の整数演算を使用する必要があります
- 両方のマシンでIEEE浮動小数点形式を使用するか、テーブルに浮動小数点列(FLOATまたはDOUBLE)を含めないでください。
実際には、これらの2つの条件にはほとんど制限がありません。最新のハードウェアでは、2の補数の整数演算とIEEE浮動小数点形式が標準です。InnoDBバイナリポータビリティの3番目の条件は、テーブルとデータベースに小文字の名前を使用することです。これは、InnoDBがこれらの名前を内部的に(データディクショナリに)Windowsで小文字で保存するためです。小文字の名前を使用すると、WindowsとUnix間のバイナリポータビリティが可能になり、小文字の名前の使用を強制するために、オプションファイルに次の行を挿入できます。
[mysqld]
lower_case_table_names=1
テーブルごとのテーブルスペースを使用するようにInnoDBを構成すると、バイナリ移植性の条件が拡張され、InnoDBテーブルの.ibdファイルも含まれるようになります。(共有テーブルスペースの条件は、すべてのInnoDBテーブルに関する情報を保存するデータディクショナリが含まれているため、引き続き適用されます。)
バイナリの移植性の条件が満たされない場合、MyISAMまたはInnoDBテーブルをあるテキスト形式(たとえば、mysqldumpを使用)でダンプし、宛先サーバーに再ロードすることにより、サーバー間でコピーできます。
個々のテーブルを移動するには、ストレージエンジンに基づいた2つの主要な方法があります。
与えられた例では、以下を想定します:
MyISAMテーブル
mydb.mytableがMyISAMストレージエンジンを使用する場合、テーブルは3つの個別のファイルとして物理的に明示されます
.frmにはテーブル構造が含まれます
。.MYDにはテーブルデータが含まれます。.MYI
にはテーブルインデックスページが含まれます
これらのファイルは、mysqlの論理的な観点からテーブルを表すために相互に依存して使用されます。これらのファイルにはそれ以上の論理的な関連付けがないため、あるDBサーバーから別のDBサーバーにテーブルを移行します。WindowsサーバーからLinuxサーバーまたはMacOSにこれを行うこともできます。もちろん、mysqlをシャットダウンして3つのテーブルファイルをコピーできます。次を実行できます。
LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
1つのsshセッションで、テーブルを読み取り専用として保持し、24時間ロックを保持します。1秒後、別のsshセッションでコピーを実行します。次に、24時間ロックでmysqlセッションを強制終了します。24時間待つ必要はありません。
InnoDBテーブル
前述の認定書からの引用に基づいて、特定のInnoDBテーブルのバックアップ方法を決定する多くの要因があります。簡単、明確、簡潔にするために、-single-transactionパラメーターを使用して目的のテーブルのmysqldumpを実行し、テーブルの完全なポイントインタイムダンプを取得します。1つのテーブルだけが必要な場合は、InnoDBセマンティクスに悩む必要はありません。そのダンプファイルを任意のMySQLサーバーにリロードできます。
ここで2つの質問がマージされたため(jcolebrand):編集
DBのパフォーマンスが多少低下する場合でも、mysqlがServerAで実行されている場合でも、古いサーバー(ServerA)から新しいサーバー(ServerB)への一連のrsyncを実行できます。
ステップ01)ServerAが持っているServerBに同じバージョンのmysqlをインストールする
ステップ02)ServerAで、SET GLOBAL innodb_max_dirty_pages_pct = 0;
mysqlから約10分実行します(これにより、InnoDBバッファープールからダーティページがパージされます。また、mysqlのシャットダウンを高速に実行できます)データベースがすべてMyISAMの場合、このステップをスキップできます。
ステップ03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
ステップ04)rsyncに1分未満かかるまでステップ03を繰り返します
ステップ05)service mysql stop
ServerAで
ステップ06)もう1つのrsyncを実行します
ステップ07) scp ServerA:/etc/my.cnf ServerB:/etc/
ステップ08)service mysql start
ServerBで
ステップ08)service mysql start
ServerAで(オプション)
試してみる !!!
警告
このようなレプリケーションスレーブを作成できます。マスター/etc/my.cnfでserver-idを設定し、スレーブ/etc/my.cnfでserver-idに別の番号を設定することを忘れないでください
データベーススキーマ全体を移動する場合はmysqldumpも必要ありません。最初のデータベースを停止してもかまいません(したがって、転送時に一貫性があります)。
mysqldumpがユーザーとパーミッションを処理するのか、それともデータだけを処理するのか覚えていませんが、処理しても、ダンプを実行して実行するよりもずっと高速です。mysqlデータベースをダンプして他のRDBMSに再挿入する必要がある場合、ストレージオプション(innodbとmyisam)を変更する必要がある場合、またはmysqlの主要なバージョンを変更する場合にのみ使用します(ただし、私は4と5の間でこれをやったと思う)
--all-databases
てmysqlスキーマをダンプします。次のマシンでmysqlを起動すると、同じメジャーリリースのMySQLを使用して他のマシンにデータフォルダを転送した場合に、アクセス許可が表示されます。(MySQL 5.5.xからMySQL 5.5.x、MySQL 5.1.xからMySQL 5.1.x、MySQL 5.0.xからMySQL 5.0.x)
mysqldump
これらはmysql
スキーマ内に保存されるため、ユーザーとパーミッションを処理します。
特定のテーブルを移動するだけの場合:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
同じコマンドで、上記のテーブル名をさらに指定できます。コマンドが完了したら、databasename.tablename.sqlファイルを他のサーバーに移動し、次を使用して復元します。
mysql -u username -ppassword databasename < databasename.tablename.sql
back .sqlファイルはmysqldumpプログラムを使用して作成され、復元はmysqlに直接行われることに注意してください。
実際のデータベースファイルを移動するこの可能性があるかもしれません(私のインストールでは/ var / lib / mysqlにあります)が、私はそれがどのように機能するかうまくいかないのか本当にわかりません。
ダウンタイムをとる必要があります。ネットワークの速度に応じて、しばらく時間がかかります。Linux / UnixでMySQLを実行していると仮定します。私が使用するプロセスは次のとおりです。
その後、通常どおりローカルMySQLのセットアップを進めます。
*注意:rsyncで-cパラメーターを使用して転送にチェックサムを追加することもできますが、これはCPU速度によっては遅くなります。
DTestのメソッドは、ubuntuとosxの間のコピーにも機能することを確認できます。
ダンプなどを行わずにすべてのデータベースをコピーするには:
あなたは、MySQLのクリーンMySQLを持っていることを確認します(mysqlのからダウンロードしたdmgインストールhttp://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmgことを、()VERY重要)実行されたことはありません。
Macの/ usr / local / mysql / data /コンテンツの上にあるubuntuマシンから/ var / lib / mysql /フォルダーのコンテンツをコピーします。ubuntuマシン上のフォルダーを取得するためにアクセスするには、sudoを使用する必要がありました。
sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder
scpを使用してフォルダーをコピーしました。
開始する前に、Macのmysqlフォルダーのコピーを使用して、混乱しないようにしてください。
フォルダーをコピーした後、Macマシンで以下を実行します。
sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/
mysqlサーバーを初めて起動します([システム環境設定]-> [mysql]の[設定]ペインから)。これで、すべてのユーザーとデータベースが正しくセットアップされます。
これは、ubuntu 64ビット11.10上のmysql 5.1.61およびosx lion(macbook pro)上のmysql 5.1.63で機能しました。
以前の回答はすべてうまくいくと思いますが、転送中にデータベース名を設定する問題に実際には対処していません。
これは私がちょうどbashでそれをやった方法です:
頻繁に行う場合rsync
はscp
、を使用してファイルを圧縮しない方がよい場合があります。
ソースサーバーで:
me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz
宛先サーバーで:
me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip | mysql $d2
いずれかのマシンで進行状況を確認します。
me@sandbox:~$ ls *.gz
me@sandbox:~$ cat $d.sql.gz | gunzip | less
これはすべて、両方のマシンのホームディレクトリにMySQL構成ファイルがあり、アクセス許可を設定していることを前提としています。
$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
別のmysqlサーバーdbに移動していますか?使用する場合は、エクスポートを行います
# mysqldump -u username -ppassword database_name > FILE.sql
おそらくこれはそれを行うより良い方法です:
バージョン1:データファイルのコピー(MYISAMのみ)
ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start
ssh server2サービスmysqlを再起動します
- データベースファイルが読み取り専用の場合、サーバーの停止をスキップできます。
バージョン2:mysqldump
pigzをインストールします-最新のXeonまたはOpteronプロセッサ、特に2つ以上のCPUがある場合、gzipよりもはるかに高速です。
ssh server1
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location
ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..
バージョン3:マスター/スレーブ+ mysqldump / file-copy
In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop";
then do version 1 or version 2
脚本:
touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end
ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz
PS:
小さなテーブルをコピーするには、次を使用します。
ssh server1 mysqldumpスキーマテーブル| ssh server2 mysqlスキーマ