【问题标题】:How to copy a table from one mysql database to another mysql database如何将表从一个mysql数据库复制到另一个mysql数据库
【发布时间】:2011-04-25 08:38:29
【问题描述】:

我需要将一个表从一个数据库复制到另一个数据库。这将是一个 cronjob。哪一个是最好的方法? PHP 脚本或 Shell 脚本。 PHP的问题,两个数据库都有不同的用户名和密码,所以我不能这样做。

CREATE TABLE db1.table1 SELECT * FROM db2.table1

我应该只连接第一个数据库获取所有记录并使用 WHILE 循环将所有记录插入新数据库还是有更好的方法?

我更喜欢使用 shell 脚本而不是 PHP 脚本来执行此操作。

谢谢

【问题讨论】:

    标签: php sql mysql linux shell


    【解决方案1】:
    exec('mysqldump --user=username --password="password" --host=hostname --database=database table1 table2 > databasedump.sql');
    
    exec('mysql --user=username --password="password" --host=hostname --database=database < databasedump.sql');
    

    【讨论】:

      【解决方案2】:

      实际上似乎没有人回答最初的问题,这是我的 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;
      }
      

      上面的解决方案不是我的,我得到了here,稍作改动。

      【讨论】:

      • mysql_connect 在 2019 年?来吧。
      • @miken32 有什么问题?
      • 它已被弃用超过 10 年。自 PHP 5 以来它甚至不存在,最后一个版本是 5 多年前发布的。
      • 旧版支持怎么样?
      • mysql_ 函数已在 2015 年 12 月发布的 PHP 7 中删除。2020 年没有理由使用它们。
      【解决方案3】:

      一个班轮有不同的服务器

      mysqldump -h host1 -u user1 -ppassword1 databasename TblName | mysql -h host2 -u user2 -ppassword2 anotherDatabase
      

      【讨论】:

      • 可选,您还可以添加替代端口,例如-P 3309
      【解决方案4】:

      使用&lt;from database&gt;

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

      【讨论】:

      • 欢迎来到stackoverflow。我觉得你的回答搞砸了。请尝试重新格式化,将其标记为代码。
      • 就目前而言,这个答案毫无意义。请添加一些解释,并更正您发布的 sn-p
      【解决方案5】:
      $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 是表的主键

      【讨论】:

        【解决方案6】:
        CREATE TABLE db_target.cloned_table 
        SELECT * 
        FROM db_source.source_table;
        

        【讨论】:

        • 简单直接。我想知道为什么没有人发现这很有用,因为我是第一个支持它的人。
        • 这不会复制密钥。
        【解决方案7】:

        我会为其他寻求帮助的人提供这个答案。

        如果您无法访问 SSH,那么您可以使用 PhpMyAdmin。

        简单地说:

        1. 浏览到要移动的表格
        2. 单击“操作”选项卡
        3. 使用 MOVE 或 COPY 到数据库功能

        如果遇到权限问题,可以临时授予用户全局权限或将同一用户添加到两个数据库。

        【讨论】:

          【解决方案8】:

          如果您需要在同一台服务器上复制表,您可以使用此代码:

          USE db2;
          
          CREATE TABLE table2 LIKE db1.table1;
          
          INSERT INTO table2  
              SELECT * FROM db1.table1;
          

          从这里复制+粘贴: codingforums.com

          这不是我的解决方案,但我觉得它很有用。

          【讨论】:

          • 这应该是公认的答案。比 mysqldump 命令行简单得多。
          【解决方案9】:
          insert into dest.table select * from orginal.table;
          

          【讨论】:

            【解决方案10】:
            mysqldump -u user1 -ppassword1 databasename TblName | mysql -u user2 -ppassword2 anotherDatabase
            

            这一切都可以在一个命令中完成。

            【讨论】:

              【解决方案11】:

              Phpmyadmin 具有将表从一个数据库复制到另一个数据库的内置功能。否则,您可以使用 Pekka 或导出表然后导入表。

              【讨论】:

              • IIRC,只有同一用户可以访问两个数据库时,内置功能才会起作用。
              【解决方案12】:

              我会扔掉它。比任何基于 PHP 的东西都简单得多。

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

              MySQL 参考:4.5.4. mysqldump — A Database Backup Program

              【讨论】:

              • 由于我只想传输一个表,我想用一点 mod 就可以了 mysqldump -u user1 -ppassword1 --add-drop-table databasename tablename > dump.sql 谢谢跨度>
              • 如果你使用phpmyadmin,那就更好了。
              • 你甚至可以通过管道传输它:mysqldump --user=root --password=remote_password the_database_name | mysql --user=root --password=local_password the_database_name;通常这可以使用 SSH 端口转发从服务器到服务器完成:ssh -f -N -L 3307:localhost:3306 nmmn(nmmn 是我的 SSH 快捷方式之一,请改用服务器名称+端口);多个表的@Ergec 使用参数--tables table1 table2
              • 就个人而言,我会将文件重新放入 mysql
              • 另外值得注意的是-p和密码之间没有空格。有些人倾向于认为这是一个拼写错误,并且如果您的密码包含任何特殊字符,您需要使用 `\` 来强调它们
              猜你喜欢
              • 1970-01-01
              • 2011-11-07
              • 2016-07-20
              • 1970-01-01
              • 1970-01-01
              • 2018-02-24
              • 1970-01-01
              • 1970-01-01
              • 2011-05-03
              相关资源
              最近更新 更多