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

Я столкнулся с такой же проблемой из-за низкого дискового пространства. И раздел, в котором размещен файл ibdata1, который является системным табличным пространством для инфраструктуры InnoDB, был заполнен.

419
задан GG. 21 December 2016 в 06:40
поделиться

3 ответа

Можно копировать таблицу без данных путем выполнения:

CREATE TABLE x LIKE y;

(См. Документы MySQL CREATE TABLE )

Вы могли записать сценарий, который берет вывод от SHOW TABLES от одной базы данных и копирует схему в другого. Необходимо быть в состоянии сослаться на имена schema+table как:

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!

РЕДАКТИРОВАНИЕ Maatkit также имеет некоторые сценарии, которые могут быть полезными для синхронизации данных. Это не может быть быстрее, но Вы могли, вероятно, выполнить их сценарии синхронизации на живых данных без большой блокировки.

133
ответ дан Gary Richardson 21 December 2016 в 06:40
поделиться

На самом деле я хотел достигнуть точно, что в 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;
0
ответ дан 22 November 2019 в 23:22
поделиться

Если вы используете Linux, вы можете использовать этот бэш-скрипт: (возможно, он нуждается в дополнительной очистке кода, но он работает ... и он работает намного быстрее, чем 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
58
ответ дан 22 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: