440

Without local access to the server, is there any way to duplicate/clone a MySQL db (with content and without content) into another without using mysqldump?

I am currently using MySQL 4.0.

GG.
  • 21,083
  • 14
  • 84
  • 130
jhornnes
  • 4,519
  • 3
  • 19
  • 8
  • 13
    What's wrong with `mysqldump`? – Michael Mior Jun 29 '11 at 21:06
  • 6
    @MichaelMior mysqldump is fine for small databases but a recent dump of a highly indexed database will take me over 40 hours to recover from a dump. That is why MySQL enterprise has an enterprise backup, with a price tag of $5k. PS: I will supply an answer that keeps the referential integrity by letting us use InnoDB and perform fast backups and recovery. – Quaternion Nov 15 '11 at 22:46
  • 1
    Is there a reason for the 'no mysqldump' requirement? It can be used to connect to remote servers if I remember. – Matt Sheppard Aug 25 '08 at 09:18
  • 50
    Make sure you **don't** do this: `CREATE TABLE t2 SELECT * FROM t1;` as you'll lose your index information, any special stuff like auto_increment etc.. many google's for this copy table sort of thing will lead you to doing this and it'll have un-desired results. – John Hunt Sep 25 '11 at 23:01
  • If you're on Windows and connect to your database from your Windows-machine, you can use a tool like [SQLyog Community (free)](http://www.webyog.com/en/download_form.php?url=http%3A%2F%2Fwww.webyog.com%2Fdownloads%2FSQLyog702.exe) to do a dump of your table. It'll do mysqldump format or CSV and it can do structure+data or just structure. – Mark Biek Aug 25 '08 at 14:21
  • 2
    I'm using MySQL Workbench. In the MySQL Utilities there is a mysqldbcopy command that worked for me. – Christopher Marshall Sep 26 '11 at 15:47
  • I'll also throw out there that if you're trying to dump a large table and get connection lost errors, you may need so set the timeout global variables on your database: set variable net_read_timeout = (seconds think default is 30) set variable net_write_timeout = (seconds think default is 60) also try adding the --single-transaction and --quick parameters to your mysqldump command. See: http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html – eze Oct 24 '13 at 16:10
  • @JohnHunt These things can be added later... – glglgl May 01 '15 at 08:26

11 Answers11

689

I can see you said you didn't want to use mysqldump, but I reached this page while looking for a similar solution and others might find it as well. With that in mind, here is a simple way to duplicate a database from the command line of a windows server:

  1. Create the target database using MySQLAdmin or your preferred method. In this example, db2 is the target database, where the source database db1 will be copied.
  2. Execute the following statement on a command line:

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

Note: There is NO space between -p and [password]

Xavi Montero
  • 9,239
  • 7
  • 57
  • 79
Rafe
  • 7,036
  • 5
  • 24
  • 27
  • mysqldump: Got error: 1449: The user specified as a definer ('root'@'127.0.0.1') does not exist when using LOCK TABLES – Tjorriemorrie Feb 03 '12 at 05:31
  • 125
    The case against **mysqldump** is that there has to be a faster way then serializing the data into queries, transmitting the queries outside of the process and through the tty back into the **exact same process**, reparsing the queries, and executing them as statements. That sounds _horribly inefficient and unnecessary_. We're not talking about crossing between MySQL masters or changing storage engines. It's shocking there is no efficient intraprocess binary transfer. – Toddius Zho Aug 23 '12 at 20:16
  • 43
    If you don't want to save the password plaintext in your terminals history, you need to split the command: `mysqldump -h [server] -u [user] -p db1 > db1`, `mysql -h [server] -u [user] -p db2 < db1` Otherwise the password prompt messes it up, at least for me when using putty. – kapex Oct 22 '12 at 09:56
  • 5
    using mysqldump and mysql from bash becomes much simpler if you set up you .my.cnf file to store your user/host/password files – ErichBSchulz Nov 11 '12 at 04:33
  • 2
    If you use bash, you can also put a space before the command (and the passwords) to disable it being remembered – varesa Aug 02 '13 at 09:37
  • Does anyone know why this doesnt work with `subprocess.check_output()`? – cammil Nov 06 '13 at 16:51
  • In case someone needs a reference on how to create a database, just read this: http://stackoverflow.com/a/2428440/2623074 – pablofiumara Nov 11 '13 at 18:56
  • This won't work when there is trigger inside the tables and the trigger refers to the former database db1. – GoYun.Info Mar 12 '14 at 14:52
  • @kapep the accepted answer works for me but I want to use your method. I get the error -bash: db1: No such file or directory, why is this where do I need to run it from? – ak85 Mar 26 '14 at 11:41
  • 1
    @ak85 The first command should create a file named `db1`, sounds like this has failed. Maybe you don't have write permissions? – kapex Mar 26 '14 at 12:16
  • 4
    `mysqldump -u root -p -v db1 | mysql -u root -p db2` and two times enter pass – Artem P May 03 '14 at 12:23
  • 1
    Fast and elegant! The copying and piping into the new database took a few seconds. Thanks also about the hint regarding not inserting the space after `-p` - that's why I always failed at mysqldump – Urs May 16 '14 at 16:11
  • How do I know if this is successful or not? I've tried this but there were no changes made nor errors. – JohnnyQ Oct 08 '14 at 14:05
  • If you don't want your password in your history in Bash, just put a single space at the start of the command and it won't save it to the history. – Matt Fletcher Jul 28 '15 at 14:18
  • 16
    god, could please someone explain my why a question stating "without mysqldump" has as first response one that uses mysqldump? with like, 6x more votes than the _correct_ one? c'mon, SO... – igorsantos07 Dec 23 '16 at 22:45
  • I know it's been years, but there are so many ways this may not work... _Run command on console_ - what console? For example most (secure) databases do not allow connections from some random remote locations. No more connection from your command line unless you are on a whitelisted host. Now what? – Aleks G Apr 20 '17 at 13:40
  • If this command is run a second time, after the data has been modified in db1, will db2 still become a copy of db1 or will the data be added to the data existing in db2? – DMop Mar 27 '18 at 16:02
  • OK here's a reason to not use mysqldump... if you want to execute this process from an AWS Lambda instance, you don't have access to mysqldump. Period. Many comments are mande that you just have to load the necessary libraries, but the total lack of examples or success stories implies to me it is impractical or ill-advised. – Tom Wilson May 02 '18 at 14:30
  • Because I dont have mysqldump available on webserver and I dont have priviledges to install too. Please consider askers point when you answer any question. Tons of answer with mysqldump we need the exceptional solution. – Erdinç Çorbacı Jul 18 '18 at 15:11
137

You can duplicate a table without data by running:

CREATE TABLE x LIKE y;

(See the MySQL CREATE TABLE Docs)

You could write a script that takes the output from SHOW TABLES from one database and copies the schema to another. You should be able to reference schema+table names like:

CREATE TABLE x LIKE other_db.y;

As far as the data goes, you can also do it in MySQL, but it's not necessarily fast. After you've created the references, you can run the following to copy the data:

INSERT INTO x SELECT * FROM other_db.y;

If you're using MyISAM, you're better off to copy the table files; it'll be much faster. You should be able to do the same if you're using INNODB with per table table spaces.

If you do end up doing an INSERT INTO SELECT, be sure to temporarily turn off indexes with ALTER TABLE x DISABLE KEYS!

EDIT Maatkit also has some scripts that may be helpful for syncing data. It may not be faster, but you could probably run their syncing scripts on live data without much locking.

Gary Richardson
  • 16,081
  • 10
  • 53
  • 48
  • 1
    is this work for duplicate table? since i see the command is CREATE TABLE – GusDeCooL Jun 27 '11 at 12:13
  • 5
    You can do [`CREATE TABLE ... SELECT`](http://dev.mysql.com/doc/refman/4.1/en/create-table-select.html). – eggyal Sep 06 '12 at 06:10
  • 3
    I tried copying the table files of a MyISAM database once, but that just corrupted the new database. Probably my bad, but it's definitely not as trivial an operation as some say it is. – Johan Fredrik Varen Aug 16 '13 at 07:56
  • 2
    This is a nice trick and I'm a fan, but an important note: **this doesn't carry over any foreign key constraints** (even ones that are external to the schema being copied) per the [MySQL Docs](https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html) – abigperson Feb 01 '17 at 18:29
60

If you are using Linux, you can use this bash script: (it perhaps needs some additional code cleaning but it works ... and it's much faster then mysqldump|mysql)

#!/bin/bash

DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com

fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
        createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
        fCreateTable="${fCreateTable} ; ${createTable}"
        insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
        fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME
jozjan
  • 739
  • 5
  • 5
  • Does this also copy constraint data and other properties of tables? – Lucas Moeskops Apr 08 '11 at 10:54
  • 1
    It seems so, because he uses a "SHOW CREATE TABLE" statement which generates a CREATE TABLE with all properties of the original. – Danita May 06 '11 at 15:34
  • Is it me or it doesn't work? It created just a few tables and throw this: Copying database (...) ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-modelowanie-copy' at line 1 ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-modelowanie-copy' at line 1 – zirael Oct 14 '11 at 10:35
  • ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'utf8_general_ci' at line 1 – zirael Oct 14 '11 at 10:41
  • 7
    If you're using the script above with InnoDB tables and have foreign keys, change the last line to the following: `echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME` – pegli Jun 14 '10 at 18:43
  • 1
    If you get the problem @zirael described it is probably because the script is failing to copy views. You can ignore views from the copy by changing the `SHOW TABLES` line to `SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'` and adding `| cut -f 1`. The complete line should look something like this but replace the double backticks with single backticks: `for TABLE in ``echo "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" | mysql $DBCONN $DBSNAME | tail -n +2 | cut -f 1``; do` – Code Commander May 30 '12 at 03:48
  • I'm getting mysql: unknown variable 'innodb_data_file_path=ibdata1:100M:autoextend' I'm on persona though which is a update to mysql - is there a fix to it? – Richard Housham Jun 14 '12 at 10:32
  • ah seems to be a problem with using mysql command in general sorry richard – Richard Housham Jun 14 '12 at 10:35
  • Seems to work but I am worried about the workaround for the foreign keys. Time will tell. – Aki Nov 05 '13 at 09:16
  • 1
    I've cleaned-up this script by @jozjan and applied some of the comments regarding foreign and other keys to create this version on GIST https://gist.github.com/christopher-hopper/8431737 – Christopher Jan 15 '14 at 07:08
13

In PHP:

function cloneDatabase($dbName, $newDbName){
    global $admin;
    $db_check = @mysql_select_db ( $dbName );
    $getTables  =   $admin->query("SHOW TABLES");   
    $tables =   array();
    while($row = mysql_fetch_row($getTables)){
        $tables[]   =   $row[0];
    }
    $createTable    =   mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
    foreach($tables as $cTable){
        $db_check   =   @mysql_select_db ( $newDbName );
        $create     =   $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
        if(!$create) {
            $error  =   true;
        }
        $insert     =   $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
    }
    return !isset($error);
}


// usage
$clone  = cloneDatabase('dbname','newdbname');  // first: toCopy, second: new database
Ulrich Eckhardt
  • 662
  • 6
  • 14
mr_app
  • 1,292
  • 2
  • 16
  • 37
4

Note there is a mysqldbcopy command as part of the add on mysql utilities.... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html

furicle
  • 1,197
  • 1
  • 9
  • 10
  • But it requires installation of an additional package: `apt install mysql-utilities` – Joel G Mathew Jul 25 '17 at 09:47
  • 3
    But there was no restriction saying that wasn't possible.... and it's a commonly installed thing (but optional as you say) If it's not installed, many would find installing that package easier than setting up and running a 60 line Bash script, etc.... – furicle Sep 18 '18 at 13:53
  • Your post was probably voted down because you didnt include any other information than a link. Answers are supposed to be more comprehensive. – Joel G Mathew Sep 18 '18 at 14:02
3

The best way to clone database tables without mysqldump:

  1. Create a new database.
  2. Create clone-queries with query:

    SET @NewSchema = 'your_new_db';
    SET @OldSchema = 'your_exists_db';
    SELECT CONCAT('CREATE TABLE ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';INSERT INTO ',@NewSchema,'.',table_name,' SELECT * FROM ', TABLE_SCHEMA ,'.',table_name,';') 
    FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW';
    
  3. Run that output!

But note, script above just fast clone tables - not views, triggers and user-functions: you can fast get structure by mysqldump --no-data --triggers -uroot -ppassword , and then use to clone only insert statement .

Why it is actual question? Because uploading of mysqldumps is ugly slow if DB is over 2Gb. And you can't clone InnoDB tables just by copying DB files (like snapshot backuping).

Alexander Goncharov
  • 1,572
  • 17
  • 20
2

All of the prior solutions get at the point a little, however, they just don't copy everything over. I created a PHP function (albeit somewhat lengthy) that copies everything including tables, foreign keys, data, views, procedures, functions, triggers, and events. Here is the code:

/* This function takes the database connection, an existing database, and the new database and duplicates everything in the new database. */
function copyDatabase($c, $oldDB, $newDB) {

    // creates the schema if it does not exist
    $schema = "CREATE SCHEMA IF NOT EXISTS {$newDB};";
    mysqli_query($c, $schema);

    // selects the new schema
    mysqli_select_db($c, $newDB);

    // gets all tables in the old schema
    $tables = "SELECT table_name
               FROM information_schema.tables
               WHERE table_schema = '{$oldDB}'
               AND table_type = 'BASE TABLE'";
    $results = mysqli_query($c, $tables);

    // checks if any tables were returned and recreates them in the new schema, adds the foreign keys, and inserts the associated data
    if (mysqli_num_rows($results) > 0) {

        // recreates all tables first
        while ($row = mysqli_fetch_array($results)) {
            $table = "CREATE TABLE {$newDB}.{$row[0]} LIKE {$oldDB}.{$row[0]}";
            mysqli_query($c, $table);
        }

        // resets the results to loop through again
        mysqli_data_seek($results, 0);

        // loops through each table to add foreign key and insert data
        while ($row = mysqli_fetch_array($results)) {

            // inserts the data into each table
            $data = "INSERT IGNORE INTO {$newDB}.{$row[0]} SELECT * FROM {$oldDB}.{$row[0]}";
            mysqli_query($c, $data);

            // gets all foreign keys for a particular table in the old schema
            $fks = "SELECT constraint_name, column_name, table_name, referenced_table_name, referenced_column_name
                    FROM information_schema.key_column_usage
                    WHERE referenced_table_name IS NOT NULL
                    AND table_schema = '{$oldDB}'
                    AND table_name = '{$row[0]}'";
            $fkResults = mysqli_query($c, $fks);

            // checks if any foreign keys were returned and recreates them in the new schema
            // Note: ON UPDATE and ON DELETE are not pulled from the original so you would have to change this to your liking
            if (mysqli_num_rows($fkResults) > 0) {
                while ($fkRow = mysqli_fetch_array($fkResults)) {
                    $fkQuery = "ALTER TABLE {$newDB}.{$row[0]}                              
                                ADD CONSTRAINT {$fkRow[0]}
                                FOREIGN KEY ({$fkRow[1]}) REFERENCES {$newDB}.{$fkRow[3]}({$fkRow[1]})
                                ON UPDATE CASCADE
                                ON DELETE CASCADE;";
                    mysqli_query($c, $fkQuery);
                }
            }
        }   
    }

    // gets all views in the old schema
    $views = "SHOW FULL TABLES IN {$oldDB} WHERE table_type LIKE 'VIEW'";                
    $results = mysqli_query($c, $views);

    // checks if any views were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $view = "SHOW CREATE VIEW {$oldDB}.{$row[0]}";
            $viewResults = mysqli_query($c, $view);
            $viewRow = mysqli_fetch_array($viewResults);
            mysqli_query($c, preg_replace("/CREATE(.*?)VIEW/", "CREATE VIEW", str_replace($oldDB, $newDB, $viewRow[1])));
        }
    }

    // gets all triggers in the old schema
    $triggers = "SELECT trigger_name, action_timing, event_manipulation, event_object_table, created
                 FROM information_schema.triggers
                 WHERE trigger_schema = '{$oldDB}'";                 
    $results = mysqli_query($c, $triggers);

    // checks if any triggers were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $trigger = "SHOW CREATE TRIGGER {$oldDB}.{$row[0]}";
            $triggerResults = mysqli_query($c, $trigger);
            $triggerRow = mysqli_fetch_array($triggerResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $triggerRow[2]));
        }
    }

    // gets all procedures in the old schema
    $procedures = "SHOW PROCEDURE STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $procedures);

    // checks if any procedures were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $procedure = "SHOW CREATE PROCEDURE {$oldDB}.{$row[1]}";
            $procedureResults = mysqli_query($c, $procedure);
            $procedureRow = mysqli_fetch_array($procedureResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $procedureRow[2]));
        }
    }

    // gets all functions in the old schema
    $functions = "SHOW FUNCTION STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $functions);

    // checks if any functions were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $function = "SHOW CREATE FUNCTION {$oldDB}.{$row[1]}";
            $functionResults = mysqli_query($c, $function);
            $functionRow = mysqli_fetch_array($functionResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $functionRow[2]));
        }
    }

    // selects the old schema (a must for copying events)
    mysqli_select_db($c, $oldDB);

    // gets all events in the old schema
    $query = "SHOW EVENTS
              WHERE db = '{$oldDB}';";
    $results = mysqli_query($c, $query);

    // selects the new schema again
    mysqli_select_db($c, $newDB);

    // checks if any events were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $event = "SHOW CREATE EVENT {$oldDB}.{$row[1]}";
            $eventResults = mysqli_query($c, $event);
            $eventRow = mysqli_fetch_array($eventResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $eventRow[3]));
        }
    }
}
Dustin
  • 123
  • 1
  • 10
  • 1
    Downvoted because the question is not "do not use mysqldump" but "use a better approach than mysqldump". This is even worse of `mysqldump` in terms of efficiency. – Valerio Bozz Sep 12 '18 at 10:46
2

Actually i wanted to achieve exactly that in PHP but none of the answers here were very helpful so here's my – pretty straightforward – solution using MySQLi:

// Database variables

$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';

$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';



// MYSQL Connect

$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );



// Create destination database

$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );



// Iterate through tables of source database

$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );

while( $table = $tables->fetch_array() ): $TABLE = $table[0];


    // Copy table and contents in destination database

    $mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
    $mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );


endwhile;
GDY
  • 2,872
  • 1
  • 24
  • 44
  • I'm not sure tihis makes a 1:1 clone but looks like for simple databases might be sufficient. – beppe9000 Mar 18 '20 at 01:13
  • I am using that for creating quick WordPress installations on my development server. This part paired with some other routines duplicate and adjust an source installation into a new project. For that it works just fine … but a blank wordpress database is not very complex so i can't make a statement for more extended use cases – GDY Mar 19 '20 at 14:30
1

I don't really know what you mean by "local access". But for that solution you need to be able to access over ssh the server to copy the files where is database is stored.

I cannot use mysqldump, because my database is big (7Go, mysqldump fail) If the version of the 2 mysql database is too different it might not work, you can check your mysql version using mysql -V.

1) Copy the data from your remote server to your local computer (vps is the alias to your remote server, can be replaced by root@1.2.3.4)

ssh vps:/etc/init.d/mysql stop
scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql
ssh vps:/etc/init.d/apache2 start

2) Import the data copied on your local computer

/etc/init.d/mysql stop
sudo chown -R mysql:mysql /tmp/var_lib_mysql
sudo nano /etc/mysql/my.cnf
-> [mysqld]
-> datadir=/tmp/var_lib_mysql
/etc/init.d/mysql start

If you have a different version, you may need to run

/etc/init.d/mysql stop
mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs
/etc/init.d/mysql start
Remy Mellet
  • 1,675
  • 20
  • 23
  • This is the most efficient way to do it but I think that "without local access to the server" means that we can't access to the system. Probably a shared hosting? So this is not the answer. – Valerio Bozz Sep 12 '18 at 10:50
0

an SQL that shows SQL commands, need to run to duplicate a database from one database to another. for each table there is create a table statement and an insert statement. it assumes both databases are on the same server:

select @fromdb:="crm";
select @todb:="crmen";

SET group_concat_max_len=100000000;


SELECT  GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;") 

SEPARATOR '\n\n')

as sqlstatement
 FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';
Shimon Doodkin
  • 4,310
  • 34
  • 37
-2

Mysqldump isn't bad solution. Simplest way to duplicate database:

mysqldump -uusername -ppass dbname1 | mysql -uusername -ppass dbname2

Also, you can change storage engine by this way:

mysqldump -uusername -ppass dbname1 | sed 's/InnoDB/RocksDB/' | mysql -uusername -ppass dbname2

Andy Al
  • 29
  • 5