没有本地访问服务器,有没有办法复制/克隆一个MySQL数据库(有内容和没有内容)到另一个不使用mysqldump?
我目前使用的是MySQL 4.0。
没有本地访问服务器,有没有办法复制/克隆一个MySQL数据库(有内容和没有内容)到另一个不使用mysqldump?
我目前使用的是MySQL 4.0。
当前回答
我可以看到你说你不想使用mysqldump,但我在寻找类似的解决方案时到达了这个页面,其他人也可能会找到它。考虑到这一点,这里有一个从windows服务器的命令行复制数据库的简单方法:
使用MySQLAdmin或您喜欢的方法创建目标数据库。在本例中,db2是目标数据库,源数据库db1将在其中复制。 在命令行中执行以下语句:
mysql -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
注意:-p和[password]之间没有空格
其他回答
实际上,我想在PHP中实现这一点,但这里没有一个答案是非常有用的,所以这里是我的-相当直接-使用MySQLi的解决方案:
// Database variables
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';
$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';
// MYSQL Connect
$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );
// Create destination database
$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );
// Iterate through tables of source database
$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );
while( $table = $tables->fetch_array() ): $TABLE = $table[0];
// Copy table and contents in destination database
$mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
$mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );
endwhile;
在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
我可以看到你说你不想使用mysqldump,但我在寻找类似的解决方案时到达了这个页面,其他人也可能会找到它。考虑到这一点,这里有一个从windows服务器的命令行复制数据库的简单方法:
使用MySQLAdmin或您喜欢的方法创建目标数据库。在本例中,db2是目标数据库,源数据库db1将在其中复制。 在命令行中执行以下语句:
mysql -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
注意:-p和[password]之间没有空格
我真的不知道你说的“本地访问”是什么意思。 但是对于这个解决方案,你需要能够通过ssh访问服务器来复制数据库存储的文件。
我不能使用mysqldump,因为我的数据库很大(7Go, mysqldump失败) 如果2个mysql数据库的版本差异太大,可能无法工作,您可以使用mysql -V检查您的mysql版本。
1)将数据从远程服务器复制到本地计算机(vps是远程服务器的别名,可以用root@1.2.3.4代替)
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
一个SQL,显示SQL命令,需要运行复制一个数据库从一个数据库到另一个。对于每个表,都有创建表语句和插入语句。它假设两个数据库都在同一台服务器上:
select @fromdb:="crm";
select @todb:="crmen";
SET group_concat_max_len=100000000;
SELECT GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;")
SEPARATOR '\n\n')
as sqlstatement
FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';