Копировать / дублировать базу данных без использования mysqldump

381

Без локального доступа к серверу существует ли способ дублировать/клонировать MySQL db (с содержимым и без содержимого) в другой, не используя mysqldump?

В настоящее время я использую MySQL 4.0.

  • 0
    Есть ли причина для требования no mysqldump? Он может быть использован для подключения к удаленным серверам, если я помню.
  • 0
    Если вы работаете в Windows и подключаетесь к своей базе данных с вашего Windows-компьютера, вы можете использовать такой инструмент, как SQLyog Community (бесплатно), чтобы сделать дамп вашей таблицы. Он будет работать в формате mysqldump или CSV, и он может создавать структуру + данные или просто структуру.
Показать ещё 21 комментарий
Теги:

6 ответов

706

Я вижу, что вы сказали, что не хотите использовать mysqldump, но я дошел до этой страницы, ища аналогичное решение, а другие могут найти его. Имея это в виду, вот простой способ дублирования базы данных из командной строки сервера Windows:

  • Создайте целевую базу данных с помощью MySQLAdmin или вашего предпочтительного метода. В этом примере db2 - это целевая база данных, в которой будет скопирована исходная база данных db1.
  • Выполните следующую инструкцию в командной строке:

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

Примечание. Между -p и [password]

нет пробела.
  • 0
    mysqldump: получена ошибка: 1449: пользователь, указанный как определитель ('root'@'127.0.0.1'), не существует при использовании LOCK TABLES
  • 3
    / что на самом деле будет хорошей причиной НЕ использовать mysqldump?
Показать ещё 20 комментариев
128

Вы можете дублировать таблицу без данных, запустив:

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 также имеет некоторые сценарии, которые могут быть полезны для синхронизации данных. Это может быть не так быстро, но вы, вероятно, можете запускать свои скрипты синхронизации на живых данных без значительной блокировки.

  • 1
    это работа для дубликата таблицы? так как я вижу, команда CREATE TABLE
  • 4
    Вы можете сделать CREATE TABLE ... SELECT .
Показать ещё 2 комментария
59

Если вы используете 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
  • 6
    Если вы используете указанный выше сценарий с таблицами InnoDB и имеете внешние ключи, измените последнюю строку на следующую: echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME
  • 0
    Копирует ли это также данные об ограничениях и другие свойства таблиц?
Показать ещё 8 комментариев
11

В 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
  • 0
    Если вы работаете на машине Windows. Тогда любезно используйте это вместо того, чтобы найти длительные способы выполнить команду.
  • 0
    этот скрипт не учитывает количество просмотров
0

Я не знаю, что вы подразумеваете под "локальным доступом". Но для этого решения вам нужно иметь доступ к серверу 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
  • 0
    Это наиболее эффективный способ сделать это, но я думаю, что «без локального доступа к серверу» означает, что мы не можем получить доступ к системе. Возможно, общий хостинг? Так что это не ответ.
0

Обратите внимание: есть команда mysqldbcopy как часть добавления утилиты mysql.... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html

  • 0
    Но для этого требуется установка дополнительного пакета: apt install mysql-utilities
  • 0
    Но не было никаких ограничений, говоря, что это невозможно ... и это обычно устанавливаемая вещь (но, как вы говорите, необязательная). Если он не установлен, многие найдут установку этого пакета проще, чем настройку и запуск 60-строчного скрипта Bash. , так далее....
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню