【发布时间】:2010-12-25 16:03:44
【问题描述】:
是否可以在 linux 服务器上复制整个 MySQL 数据库?
我知道我可以使用导出和导入,但原始数据库>25MB,所以这并不理想。
是否可以使用 mysqldump 或直接复制数据库文件?
【问题讨论】:
是否可以在 linux 服务器上复制整个 MySQL 数据库?
我知道我可以使用导出和导入,但原始数据库>25MB,所以这并不理想。
是否可以使用 mysqldump 或直接复制数据库文件?
【问题讨论】:
我有时会做一个 mysqldump 并将输出通过管道传输到另一个 mysql 命令,以将其导入到不同的数据库中。
mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
【讨论】:
到远程服务器
mysqldump mydbname | ssh host2 "mysql mydbcopy"
到本地服务器
mysqldump mydbname | mysql mydbcopy
【讨论】:
首先创建副本数据库:
CREATE DATABASE duplicateddb;
确保用户和权限都到位并且:
mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb;
【讨论】:
--routines作为选项。
~/.bash_history 文件中编辑出来。或者你也可以将第一个命令的结果输出到一个临时文件中,然后执行以下命令(会提示你输入密码)mysql -p -u admin duplicatedb < temporaryfile.sql。
这是我编写的一个 Windows bat 文件,它结合了 Vincent 和 Pauls 的建议。它会提示用户输入源名称和目标名称。
只需修改顶部的变量以设置可执行文件/数据库端口的正确路径。
:: 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!!!
【讨论】:
这不适用于 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
【讨论】:
在具有数据的系统中创建一个mysqldump文件,并使用管道将此mysqldump文件作为新系统的输入。新系统可以使用 ssh 命令连接。
mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name
-p[密码]之间没有空格
【讨论】:
制作数据库副本
# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql
【讨论】:
这适用于我的命令提示符,来自 OUTSIDE mysql shell:
# 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”大约需要一分钟,将数据转储到新的 DB db2 大约需要三分钟。
直接复制洞 db 目录 (mysql/data/db1) 对我不起作用,我猜是因为 InnoDB 表。
【讨论】:
曾几何时,在 MySQL 中,您可以将所有表文件复制到 mysql 树中的另一个目录
mysql cli - 创建数据库 db2
linux cli - cp db1 db2
【讨论】:
对我来说,以下代码行成功了
mysqldump --quote-names -q -u username1 --password='password1' originalDB | mysql -u username2 --password='password2' duplicateDB
【讨论】: