Clone MySQL database

前端 未结 7 771
攒了一身酷
攒了一身酷 2020-12-12 13:37

I have database on a server with 120 tables.

I want to clone the whole database with a new db name and the copied data.

Is there an efficient way to do this?

相关标签:
7条回答
  • 2020-12-12 14:11

    There is mysqldbcopy tool from the MySQL Utilities package. http://dev.mysql.com/doc/mysql-utilities/1.3/en/mysqldbcopy.html

    0 讨论(0)
  • 2020-12-12 14:18

    If you want to make sure it is an exact clone, the receiving database needs to be entirely cleared / dropped. This way, the new db only has the tables in your import file and nothing else. Otherwise, your receiving database could retain tables that weren't specified in your import file.
    ex from prior answers:

    DB1 == tableA, tableB
    DB2 == tableB, tableC
    DB1 imported to -> DB2
    DB2 == tableA, tableB, tableC //true clone should not contain tableC
    

    the change is easy with --databases and --add-drop-database (see mysql docs). This adds the drop statement to the sqldump so your new database will be an exact replica:

    $ mysqldump -h $ip -u $user -p$pass --databases $dbname --add-drop-database > $file.sql
    $ mysql -h $ip $dbname -u $user -p$pass < $file.sql
    

    of course replace the $ variables and as always, no space between password and -p. For extra security, strip the -p$pass from your command

    0 讨论(0)
  • 2020-12-12 14:25
    $newdb = (date('Y')-1);
    $mysqli->query("DROP DATABASE `".$newdb."`;");
    $mysqli->query("CREATE DATABASE `".$newdb."`;");
    
    $query = "
    SELECT
    TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA LIKE 'rds'
    ";
    $result = $mysqli->query($query)->fetch_all(MYSQLI_ASSOC);
    foreach($result as $val) {
        echo $val['TABLE_NAME'].PHP_EOL;
        $mysqli->query("CREATE TABLE `".$newdb."`.`".$val['TABLE_NAME']."` LIKE rds.`".$val['TABLE_NAME']."`");
        $mysqli->query("INSERT `".$newdb."`.`".$val['TABLE_NAME']."` SELECT * FROM rds.`".$val['TABLE_NAME']."`");
    }
    
    0 讨论(0)
  • 2020-12-12 14:26

    Like accepted answer but without .sql files:

    mysqldump sourcedb -u <USERNAME> -p<PASS> | mysql destdb -u <USERNAME> -p<PASS>
    
    0 讨论(0)
  • 2020-12-12 14:33
    $ mysqldump yourFirstDatabase -u user -ppassword > yourDatabase.sql
    $ mysql yourSecondDatabase -u user -ppassword < yourDatabase.sql
    
    0 讨论(0)
  • 2020-12-12 14:34
    mysqldump -u <user> --password=<password> <DATABASE_NAME> | mysql -u <user> --password=<password> -h <hostname> <DATABASE_NAME_NEW>
    
    0 讨论(0)
提交回复
热议问题