Используя PHP и MySQL в сценарии, запущенном на mysite1.com, я пытаюсь скопировать все строки и столбцы из таблицы на mysite2.com в идентичную таблицу (уже созданную) на mysite1.com. Сначала я подключаюсь к обеим базам данных (я уже установил удаленные подключения MySQL на mysite2.com).
$con1 = mysql_connect("mysite1.com", "username1", "password1"); if (!$con1) {die('Could not connect: ' . mysql_error());} mysql_select_db("database1", $con1); $con2 = mysql_connect("mysite2.com", "username2", "password2"); if (!$con2) {die('Could not connect: ' . mysql_error());} mysql_select_db("database2", $con2);
Я не могу понять, как отформатировать строку «INSERT INTO» sql, чтобы получить данные от mysite2.com и поместить ее в mysite1.com. Кто-нибудь знает как это сделать?
INSERT INTO my_table1 SELECT * FROM my_table2
Не может быть сделано так, как вы думаете. Вы можете создать объединенную таблицу и скопировать ее. Наверное проще просто использовать mysqldump, а затем загрузить файл, который он создает.
Третий вариант – считывать данные через php и генерировать операторы INSERT, но это будет самый медленный из трех вариантов.
MySQL делает инструмент помощника миграции, который сделает это. Теперь эта функциональность может быть сложена в Workbench.
Вы также можете подумать о следующем:
из mysql1 подключиться к mysql1: SELECT * FROM table INTO OUTFILE filename
из mysql1 подключиться к mysql2: LOAD DATA LOCAL INFILE filename INTO TABLE table
Это будет довольно быстро, но это будет не идеальная копия, если вы делаете вставки в mysql1, пока это происходит.
Если вам нужно, чтобы они синхронизировались, репликация, безусловно, является ответом.
Дескриптор соединения mysql нельзя разделить между разными серверами. Он специально привязан к серверу, на котором вы его открыли, и вот где он останется.
Есть пара вариантов. упомянутые объединенные таблицы. Существует также репликация . Из двух, репликация, вероятно, самая легкая в обслуживании, хотя это немного боль, чтобы встать и работать. После того, как все будет готово, он будет обрабатывать все обновления для реплицированных таблиц / баз данных прозрачно, и вам не нужно беспокоиться об этом.
С объединенными таблицами вы должны запускать свои запросы не менее двух раз. Один для «локальной» таблицы и по одной для каждой «удаленной» таблицы. И у вас возникнут проблемы с транзакциями: они вообще не поддерживаются в федеративных таблицах.
$con1 = mysql_connect("mysite1.com", "username1", "password1"); if (!$con1) {die('Could not connect: ' . mysql_error());} mysql_select_db("database1", $con1); $result = mysql_query('SELECT * FROM `some_table`', $con1); $query = array(); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $query[] = '('.implode(',', $row).')'; } $con2 = mysql_connect("mysite2.com", "username2", "password2"); if (!$con2) {die('Could not connect: ' . mysql_error());} mysql_select_db("database2", $con2); mysql_query('INSERT INTO `some_table` VALUES '.implode(',', $query).';', $con2);
Вы можете использовать сторонний синхронизатор базы данных, такой как http://www.quest.com/toad-for-mysql/ (бесплатно)
Попробуй это:
// origin $dblink1=mysql_connect('mysite1.com', 'user1', 'password1'); mysql_select_db('db1', $dblink1); // destination $dblink2=mysql_connect('mysite2.com', 'user2', 'password2'); mysql_select_db('db2',$dblink2); $res_from = mysql_query("show tables", $dblink1); if($res_from === FALSE) { die(mysql_error()); // for error handling } while($table = mysql_fetch_array($res_from)) { echo($table[0] . "<br />"); // optional, only for show the name tables $table=$table[0]; $tableinfo = mysql_fetch_array(mysql_query("SHOW CREATE TABLE $table ",$dblink1)); // retrieve table structure from mysite1.com mysql_query(" $tableinfo[1] ",$dblink2); // use found structure to make table on mysite2.com $res_to = mysql_query("SELECT * FROM $table ",$dblink1); // select all content from table mysite1.com while ($row = mysql_fetch_array($res_to, MYSQL_ASSOC) ) { $sql_error = ""; mysql_query("INSERT INTO $table (".implode(", ",array_keys($row)).") VALUES ('".implode("', '",array_values($row))."')",$dblink2); // insert one row into new table on mysite2.com`enter code here` $sql_error = mysql_error($dblink2); } if ($sql_error) { echo $sql_error; }else { echo "copy table ".$table." done.<br />"; } flush(); } mysql_close($dblink1); mysql_close($dblink2);
ВАЖНЫЙ! убедитесь, что у вас есть пользователь со всеми привилегиями в mysql mysite1.com. В любом случае вы можете сделать так: CREATE USER 'myuser' @ '%' IDENTIFIED BY 'mypassword'; GRANT ALL ON * . * To myuser;