Я столкнулся с такой же проблемой из-за низкого дискового пространства. И раздел, в котором размещен файл ibdata1, который является системным табличным пространством для инфраструктуры InnoDB, был заполнен.
Можно копировать таблицу без данных путем выполнения:
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 также имеет некоторые сценарии, которые могут быть полезными для синхронизации данных. Это не может быть быстрее, но Вы могли, вероятно, выполнить их сценарии синхронизации на живых данных без большой блокировки.
На самом деле я хотел достигнуть точно, что в 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;
Если вы используете 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