MySQLデータベース全体の複製


88

MySQLサーバー全体をLinuxサーバーに複製することはできますか?

エクスポートとインポートを使用できることはわかっていますが、元のデータベースは25MBを超えるため、理想的ではありません。

mysqldumpを使用すること、またはデータベースファイルを直接複製することは可能ですか?

回答:


172

最初に複製データベースを作成します。

CREATE DATABASE duplicateddb;

ユーザーと権限がすべて整っていることを確認します。

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

28
2番目のコマンドラインの2番目の部分で、 "-p"と "password"の間にスペースを

16
そこにスペースがあってはいけません!答えはこのように正しいです。mysqlのマニュアルページには、次のように記載されています。--password [= password]、-p [password]サーバーに接続するときに使用するパスワード。短いオプション形式(-p)を使用する場合、オプションとパスワードの間にスペースを入れることはできません。コマンドラインで--passwordまたは-pオプションに続くパスワード値を省略すると、mysqlはそれを要求します。コマンドラインでパスワードを指定することは安全ではないと考えるべきです。セクション6.1.2.1「Pのエンドユーザーガイドライン」を参照してください
nils petersohn

2
mysqldumpはデフォルトでトリガーをバックアップしますが、ストアドプロシージャはバックアップしないことに注意してください--routines。この場合のオプションとして追加します。
LinuxDevOps 2014年

1
このようにしていて、このユーザーのMySQLパスワードをbash履歴で使用したくない場合は~/.bash_history、実行後にファイルから編集します。または、最初のコマンドの結果を一時ファイルに出力し、その後に次のコマンドを実行することもできます(パスワードの入力を求められます)mysql -p -u admin duplicatedb < temporaryfile.sql
マイク

1
この回答は確かに機能しますが、質問には「エクスポートとインポートを使用できることはわかっていますが、元のデータベースは25MBを超えるため理想的ではない」とあり、この回答が示唆するのは基本的にエクスポートとインポートです。
el.pescado 16


5

mysqldumpを実行して出力を別のmysqlコマンドにパイプし、別のデータベースにインポートすることもあります。

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

これを使用すると、destデータベースが存在しないというエラーが表示されます。したがって、CREATE DATABASE行も必要です。
blak3r 2012年

3

データを含むシステムにmysqldumpファイルを作成し、パイプを使用してこのmysqldumpファイルを新しいシステムへの入力として提供します。新しいシステムは、sshコマンドを使用して接続できます。

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

-p [パスワード]の間にスペースを入れない


1
パイプの使用など、これがどのように機能するかの説明を追加できますか?
kalyfe

1

VincentとPaulsの提案を組み合わせた、私が書いたWindows batファイルを次に示します。ユーザーにソース名と宛先名の入力を求めます。

上部の変数を変更して、実行可能ファイル/データベースポートへの適切なパスを設定します。

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

出力例:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

これはInnoDBでは機能しません。この回避策は、MyISAMデータベースをコピーする場合にのみ使用してください。

バックアップ中にテーブルをロックし、データベースのインポート中にMySQLを一時停止することが許容される場合、mysqlhotcopyはより高速に動作する可能性があります。

例えば

バックアップ:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

戻す:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopyはSSH(scp)経由でファイルを転送することもでき、場合によっては複製データベースディレクトリに直接転送することもできます。

例えば

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

データベースのコピーを作成する

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

0

これは、MySQLシェルの外側から、コマンドプロンプトを使用して機能しました。

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

これは私にとって最良の方法です。「dump.sql」を圧縮する場合は、圧縮されたバックアップとしてそれを明示的に保存できます。涼しい!Innodbテーブルを含む1GBデータベースの場合、「dump.sql」を作成するのに約1分、新しいDB db2にデータをダンプするのに約3分。

InnoDBテーブルが原因で、ホールdbディレクトリ(mysql / data / db1)を直接コピーするだけではうまくいきませんでした。


-2

かつてのMySQLでは、すべてのテーブルファイルをmysqlツリーの別のディレクトリにコピーするだけでした。

mysql cli-データベースdb2を作成する

Linux cli-cp db1 db2


MyISAMでのみ機能しますよね?あの悪い古き良き時代は過ぎ去った。
ローレンツアルベ

歴史書には良いが、もうあまり役に立たない。
JJJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.