web-dev-qa-db-fra.com

Comment copier une table d'une base de données mysql vers une autre base de données mysql

J'ai besoin de copier une table d'une base de données à une autre. Ce sera une cronjob. Laquelle est la meilleure façon de le faire? PHP script ou Script Shell. Le problème avec PHP, les deux bases de données ont des noms d'utilisateur et des mots de passe différents, donc je ne peux pas le faire comme ça.

CREATE TABLE db1.table1 SELECT * FROM db2.table1

Dois-je simplement connecter la première base de données pour obtenir tous les enregistrements et insérer tout dans la nouvelle base de données en utilisant la boucle WHILE ou il existe une meilleure façon?

Je préfère un script Shell pour ce faire au lieu de PHP.

Merci

25
Ergec

Je le jetterais. Beaucoup moins compliqué qu'autre chose PHP based.

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

Référence MySQL: 4.5.4. Mysqldump - Un programme de sauvegarde de base de données

32
Pekka 웃

Si vous devez copier la table sur le même serveur, vous pouvez utiliser ce code:

USE db2;

CREATE TABLE table2 LIKE db1.table1;

INSERT INTO table2  
    SELECT * FROM db1.table1;

C'est copier + coller d'ici: codingforums.com

Ce n'est pas ma solution, mais je la trouve utile.

39
Radu Damian
mysqldump -u user1 -ppassword1 databasename TblName | mysql -u user2 -ppassword2 anotherDatabase

Tout peut être fait en une seule commande.

29
shantanuo
$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, table 1 fait référence à la table initiale user2, pass2, base de données 2, table2 fait référence à la table copiée $ keyfield est la clé primaire de la table

6
user3637009

Phpmyadmin a une fonctionnalité intégrée pour copier des tables d'une base de données vers une autre. Sinon, vous pouvez aller avec Pekka ou exporter la table puis importer la table.

5
gautamlakum

Je mettrai cette réponse à la disposition de toute autre personne à la recherche d'aide.

Si vous n'avez pas accès à SSH, vous pouvez utiliser PhpMyAdmin.

Simplement:

  1. accédez au tableau que vous souhaitez déplacer
  2. Cliquez sur l'onglet Opérations
  3. Utilisez la fonction MOVE ou COPY to database

Si vous rencontrez des problèmes de privilèges, vous pouvez accorder temporairement des autorisations globales à un utilisateur ou ajouter le même utilisateur aux deux bases de données.

3
itschrishill

Un liner avec différents serveurs

mysqldump -h Host1 -u user1 -ppassword1 databasename TblName | mysql -h Host2 -u user2 -ppassword2 anotherDatabase
3
Juergen
CREATE TABLE db_target.cloned_table 
SELECT * 
FROM db_source.source_table;
0
Fury

utilisation <from database>

create table <to database.new name> as (select * from <table to copy>);
0
user2597353

Comme il semble que personne n'ait répondu à la question initiale, voici mon script PHP pour sauvegarder une table d'un serveur MySQL distant vers un serveur MySQL local:

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;
}

La solution ci-dessus n'est pas la mienne, je l'ai eu ici , avec des changements mineurs.

0
insert into dest.table select * from orginal.table;
0
Peter Eskandar