Как скопировать таблицу из одной базы данных mysql в другую базу данных mysql - PullRequest
24 голосов
/ 14 октября 2010

Мне нужно скопировать таблицу из одной базы данных в другую. Это будет cronjob. Какой из них лучший способ сделать это? PHP-скрипт или Shell Script. Проблема с PHP, обе базы данных имеют разные имена пользователей и пароли, поэтому я не могу сделать это так.

CREATE TABLE db1.table1 SELECT * FROM db2.table1

Стоит ли просто подключить первую БД, получить все записи и вставить все в новую базу данных с помощью цикла WHILE, или есть лучший способ?

Я предпочитаю сценарий оболочки, чтобы сделать это вместо сценария PHP.

Спасибо

Ответы [ 11 ]

38 голосов
/ 20 июня 2013

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

USE db2;

CREATE TABLE table2 LIKE db1.table1;

INSERT INTO table2  
    SELECT * FROM db1.table1;

Это копия + вставлена ​​здесь: codingforums.com

Это не мое решение, но я считаю его полезным.

32 голосов
/ 14 октября 2010

Я бы бросил это. Гораздо менее сложный, чем что-либо на основе PHP.

mysqldump -u user1 -ppassword1 databasename > dump.sql
mysql -u user2 -ppassword2 databasename < dump.sql

Ссылка на MySQL: 4.5.4. mysqldump - Программа резервного копирования базы данных

28 голосов
/ 11 ноября 2010
mysqldump -u user1 -ppassword1 databasename TblName | mysql -u user2 -ppassword2 anotherDatabase

Все это можно сделать одной командой.

6 голосов
/ 14 мая 2014
$L1 = mysql_connect('localhost', 'user1', 'pass1');
$DB1 = mysql_select_db('database1', $L1);   

$L2 = mysql_connect('localhost', 'user2', 'pass2');
$DB2 = mysql_select_db('database2', $L2);   

$re=mysql_query("SELECT * FROM table1",$L1);
while($i=mysql_fetch_assoc($re))
{
    $u=array();
    foreach($i as $k=>$v) if($k!=$keyfield) $u[]="$k='$v'";
    mysql_query("INSERT INTO table2 (".implode(',',array_keys($i)).") VALUES ('".implode("','",$i)."') ON DUPLICATE KEY UPDATE ".implode(',',$u),$L2) or die(mysql_error());
}

user1, pass1, database1, table1 ссылается на исходную таблицу user2, pass2, database2, table2 ссылается на скопированную таблицу $ keyfield является первичным ключом таблицы

5 голосов
/ 14 октября 2010

Phpmyadmin имеет встроенную функциональность для копирования таблиц из одной базы данных в другую. В противном случае вы можете использовать Pekka или таблицу экспорта, а затем импортировать таблицу.

3 голосов
/ 06 марта 2017

Один лайнер с разными серверами

mysqldump -h host1 -u user1 -ppassword1 databasename TblName | mysql -h host2 -u user2 -ppassword2 anotherDatabase
3 голосов
/ 05 октября 2013

Я отправлю этот ответ всем, кто ищет помощь.

Если у вас нет доступа к SSH, вы можете использовать PhpMyAdmin.

Просто:

  1. перейдите к таблице, которую вы хотите переместить
  2. Перейдите на вкладку Операции
  3. Используйте функцию ПЕРЕМЕЩЕНИЕ или КОПИРОВАНИЕ в базу данных

Если вы встретитепроблемы с привилегиями, вы можете временно предоставить пользователю глобальные разрешения или добавить одного и того же пользователя в обе базы данных.

0 голосов
/ 23 февраля 2019

Поскольку кажется, что никто не ответил на первоначальный вопрос, вот мой PHP-скрипт для резервного копирования таблицы с удаленного сервера MySQL на локальный сервер MySQL:

function backup_remote_table (
    $remote_db_host, $remote_login, $remote_password, $remote_db_name, $remote_table_name,
    $local_db_host, $local_login, $local_password, $local_db_name, $local_table_name
) {
    // Generating names with time stamps for local database and/or local table, if not available
    if ($local_table_name) {
        $applied_local_table_name = $local_table_name;
    } else {
        $applied_local_table_name = $remote_table_name;
    }
    if ($local_db_name) {
        $applied_local_db_name = $local_db_name;
        if (!$local_table_name) {
          $applied_local_table_name .= date_format(date_create(), '_Y_m_d_H_i_s');
        }
    } else {
        $applied_local_db_name = $remote_db_name . date_format(date_create(), '_Y_m_d_H_i_s');
    }

    // Local server connection
    $local_db_server = mysql_connect($local_db_host, $local_login, $local_password);
    $local_db_server = mysql_query("CREATE DATABASE IF NOT EXISTS " . $applied_local_db_name, $local_db_server);
    mysql_select_db($applied_local_db_name, $local_db_server);

    // Remote server connection
    $remote_db_server = mysql_connect($remote_db_host, $remote_login, $remote_password);
    mysql_select_db($remote_db_name, $remote_db_server);

    // Getting remote table data
    $result_remote_table_info = mysql_query("SHOW CREATE TABLE " . $remote_table_name, $remote_db_server);
    $remote_table_info = mysql_fetch_array($result_remote_table_info);
    $remote_table_description = substr($remote_table_info[1], 13);

    // Creating local table
    $sql_new_table = "CREATE TABLE IF NOT EXISTS " . $applied_local_db_name . "." . $remote_table_description;
    mysql_query($sql_new_table, $local_db_server);

    // Getting all records of remote table
    $result_remote_table_data = mysql_query("SELECT * FROM " . $table_name, $remote_db_server);
    while ($remote_table_row = mysql_fetch_array($result_remote_table_data, MYSQL_ASSOC)){
        // Browsing records of remote table
        $sql_new_row = "INSERT INTO $applied_local_db_name.$applied_local_table_name (".implode(", ",array_keys($remote_table_row)).") VALUES (";
        $extra_sql = "";
        foreach (array_values($remote_table_row) as $value) {
            if ($extra_sql != "") {
                $extra_sql .= ",";
            }
            $extra_sql .= "'";
            $extra_sql .= mysql_real_escape_string($value);
            $extra_sql .= "'";
        }
        $sql_new_row .= $extra_sql . ")";
        // Adding record to local table
        $result_new_table_row = mysql_query($sql_new_row, $local_db_server);
    }
    mysql_free_result($result_remote_table_data);

    return;
}

Решение выше не моеЯ понял здесь , с небольшими изменениями.

0 голосов
/ 15 октября 2013
CREATE TABLE db_target.cloned_table 
SELECT * 
FROM db_source.source_table;
0 голосов
/ 19 июля 2013

использование <from database>

create table <to database.new name> as (select * from <table to copy>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...