Без локального доступа к серверу существует ли способ дублировать/клонировать MySQL db (с содержимым и без содержимого) в другой, не используя mysqldump
?
В настоящее время я использую MySQL 4.0.
Без локального доступа к серверу существует ли способ дублировать/клонировать MySQL db (с содержимым и без содержимого) в другой, не используя mysqldump
?
В настоящее время я использую MySQL 4.0.
Я вижу, что вы сказали, что не хотите использовать mysqldump
, но я дошел до этой страницы, ища аналогичное решение, а другие могут найти его. Имея это в виду, вот простой способ дублирования базы данных из командной строки сервера Windows:
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 Docs)
Вы можете написать script, который выводит результат из SHOW TABLES
из одной базы данных и копирует схему в другую. Вы должны иметь возможность ссылаться на имена таблиц схемы +:
CREATE TABLE x LIKE other_db.y;
Что касается данных, вы также можете сделать это в MySQL, но это не обязательно быстро. После создания ссылок вы можете запустить следующее для копирования данных:
INSERT INTO x SELECT * FROM other_db.y;
Если вы используете MyISAM, вам лучше скопировать файлы таблиц; это будет намного быстрее. Вы должны сделать то же самое, если используете INNODB с для табличных таблиц.
Если вы делаете INSERT INTO SELECT
, не забудьте временно отключить индексы с помощью ALTER TABLE x DISABLE KEYS
!
EDIT Maatkit также имеет некоторые сценарии, которые могут быть полезны для синхронизации данных. Это может быть не так быстро, но вы, вероятно, можете запускать свои скрипты синхронизации на живых данных без значительной блокировки.
Если вы используете Linux, вы можете использовать этот bash script: (возможно, потребуется дополнительная очистка кода, но он работает... и он намного быстрее, чем 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
Я не знаю, что вы подразумеваете под "локальным доступом". Но для этого решения вам нужно иметь доступ к серверу ssh, чтобы скопировать файлы, где хранится база данных.
Я не могу использовать mysqldump, потому что моя база данных большая (7Go, mysqldump fail) Если версия 2 базы данных mysql слишком отличается, она может не работать, вы можете проверить свою версию mysql с помощью mysql -V.
1) Скопируйте данные с удаленного сервера на локальный компьютер (vps является псевдонимом вашего удаленного сервера, может быть заменен на [email protected])
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