复制/复制数据库而不使用mysqldump
如果没有本地访问服务器,是否有任何方法复制/克隆MySQL数据库(内容和没有内容)到另一个没有使用mysqldump
?
我目前正在使用MySQL 4.0。
我可以看到你说你不想使用mysqldump
,但是当我find一个类似的解决scheme时,我到达了这个页面,其他人也可能会find它。 考虑到这一点,下面是从Windows服务器的命令行复制数据库的简单方法:
- 使用MySQLAdmin或您首选的方法创build目标数据库。 在这个例子中,
db2
是目标数据库,其中源数据库db1
将被复制。 - 在命令行上执行以下语句:
mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
注意-p
和[password]
之间没有空格
您可以通过运行复制没有数据的表格:
CREATE TABLE x LIKE y;
(请参阅MySQL CREATE TABLE文档)
您可以编写一个脚本,将来自一个数据库的SHOW TABLES
的输出复制到另一个数据库。 您应该能够引用模式+表名称,如:
CREATE TABLE x LIKE other_db.y;
就数据而言,你也可以在MySQL中做,但不一定快。 创build引用后,可以运行以下命令来复制数据:
INSERT INTO x SELECT * FROM other_db.y;
如果你使用MyISAM,你最好复制表格文件; 它会更快。 如果您对每个表空间使用INNODB,则应该可以这样做。
如果你最终做了一个INSERT INTO SELECT
,一定要暂时closures索引 ALTER TABLE x DISABLE KEYS
!
编辑 Maatkit也有一些脚本,可能有助于同步数据。 这可能不会更快,但是您可以在实时数据上运行他们的同步脚本,而不需要太多locking。
如果你使用的是Linux,你可以使用这个bash脚本:(它可能需要一些额外的代码清理,但它的工作原理…这比mysqldump | mysql快得多)
#!/bin/bash DBUSER=user DBPASSWORD=pwd DBSNAME=sourceDb DBNAME=destinationDb DBSERVER=db.example.com fCreateTable="" fInsertData="" echo "Copying database ... (may take a while ...)" DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}" echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN} echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN} for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-` fCreateTable="${fCreateTable} ; ${createTable}" insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}" fInsertData="${fInsertData} ; ${insertData}" done; echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME
在PHP中:
function cloneDatabase($dbName, $newDbName){ global $admin; $db_check = @mysql_select_db ( $dbName ); $getTables = $admin->query("SHOW TABLES"); $tables = array(); while($row = mysql_fetch_row($getTables)){ $tables[] = $row[0]; } $createTable = mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error()); foreach($tables as $cTable){ $db_check = @mysql_select_db ( $newDbName ); $create = $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable); if(!$create) { $error = true; } $insert = $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable); } return !isset($error); } // usage $clone = cloneDatabase('dbname','newdbname'); // first: toCopy, second: new database
请注意,有一个mysqldbcopy命令作为添加mysql实用程序的一部分…. https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html
我不太清楚“本地访问”是什么意思。 但是对于这个解决scheme,你需要能够通过ssh访问服务器来复制存储数据库的文件 。
我不能使用mysqldump,因为我的数据库很大(7Go,mysqldump失败)如果2个mysql数据库的版本太差,可能无法正常工作,可以用mysql -V查看你的mysql版本。
1)将数据从远程服务器复制到本地计算机(vps是远程服务器的别名,可由root@1.2.3.4replace)
ssh vps:/etc/init.d/mysql stop scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql ssh vps:/etc/init.d/apache2 start
2)导入在本地计算机上复制的数据
/etc/init.d/mysql stop sudo chown -R mysql:mysql /tmp/var_lib_mysql sudo nano /etc/mysql/my.cnf -> [mysqld] -> datadir=/tmp/var_lib_mysql /etc/init.d/mysql start
如果您有不同的版本,则可能需要运行
/etc/init.d/mysql stop mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs /etc/init.d/mysql start