copy database structure without data in mysql (with empty tables)

前端 未结 6 1221
醉酒成梦
醉酒成梦 2021-01-31 02:36

Is there any way to copy database structure without data in MySQL, so the new database will be the same as it is copied from, but with empty tables.

After getting some s

相关标签:
6条回答
  • 2021-01-31 02:56

    From electrictboolbox.com/mysqldump-schema-only:

    Dumping the database structure for all tables with no data Add the -d flag to signify that no data should be included in the output like so, where "mydatabase" is the name of the database to dump, and "someuser" is the login name used to connect to the database. The following command will dump the table structure for all tables in the specified MySQL database:

    $ mysqldump -d -u someuser -p mydatabase
    

    The -d flag says not to include data in the dump. Alternatively you can use --no-data instead if you find that easier to remember:

    $ mysqldump --no-data -u someuser -p mydatabase
    

    The -u flag indicates the username and the -p flag that a password will be supplied. After pressing you will be prompted for the password.

    Alternatively, the password can be supplied on the command line, but there must be no space between the -p flag and the password. For example, if the password was "apples" do this:

    $ mysqldump --no-data -u someuser -papples mydatabase
    $ mysqldump -d -u someuser -p mydatabase > mydatabase.sql # This will output to a sql file
    
    0 讨论(0)
  • 2021-01-31 02:58

    mysqldump -d is not enough because in TRIGGERS, PROCEDURES etc. you can have references like 'old_db'.tb_name that must be replaced with 'new_db'.tb_name

    # ./db_clone.sh  old_db  new_db

    I use a file /root/.mysqlcnx with credentials (instead of using -u root -pPass)

    [client]
    user = root # or powerfull_user with GRANTS 
    password = pass_string
    host = localhost
    

    and the following script to clone a database [ experiment it on a virtual machine for confidence ]

    #!/bin/bash
    
    if [ $# -lt 2 ]; then
       echo "syntax:\n.\db_clone.sh source_db_name target_db_name [--drop]\n"
    exit 1
    fi
    
        # checking target database $2 exits
    tg_db=$(mysql --defaults-extra-file=~/.mysqlcnx -s -N -e "SELECT count(*)>0 FROM 
             information_schema.SCHEMATA where SCHEMA_NAME='${2}'")
    if [ $tg_db = '1' ]; then
        # checking target database has tables
        tg_tb=$(mysql --defaults-extra-file=~/.mysqlcnx -s -N -e " SELECT count(*) > 0 
                FROM information_schema.TABLES WHERE TABLE_SCHEMA='${2}'")
      if [ $tg_tb = '1' ]; then
         if [ $# -eq 3 ] && [ "$3" = '--drop' ]; then
            echo "TYPE 'YES' (case sensitive) TO OVERRIDE"
            read opt # request confirmation 
            if [ "$opt" != "YES" ]; then
                echo "OPERATION CANCELED!"
                exit 1
            fi
         else
           printf "DATABASE \"${2}\" EXISTS AND HAS TABLES\nUSE --drop as 3rd arg to override!\n"
           exit 1
         fi
      fi
    else 
      mysql --defaults-extra-file=~/.mysqlcnx -e "CREATE DATABASE \`${2}\`" 
    fi
    
    echo "CREATING ${2}"
    mysqldump --defaults-extra-file=~/.mysqlcnx -d $1 | # dump source
    sed "s/\`${1}\`\./\`${2}\`\./g" |  #  solving `source_db`.tb_name       
    sed 's/AUTO_INCREMENT=[0-9]\+/''/g' | # solving  AUTO_INCREMENT=1
    mysql --defaults-extra-file=~/.mysqlcnx $2  # populating target_db 
    echo "DONE"
    

    NOTE: someone that knows bash better please correct me if necessary

    0 讨论(0)
  • 2021-01-31 03:02
    mysqldump -u user -ppass -d olddb | mysql -u user -ppass -D newdb
    

    The new database must already exist. The -d flag in the mysqldump command prevents copying of data.

    There's no space between the flag -p and the password.

    0 讨论(0)
  • 2021-01-31 03:06

    You can backup you MYSQL database structure with

    mysqldump -u username –p  -d database_name > backup.sql
    

    (You should not supply password at command line as it leads to security risks.MYSQL will ask for password by default.) And you can create create tables in database with

    mysql -u username -p new_database < backup.sql
    

    Now you can use pipe to give the output of first command as output for second one and you will no longer need backup.sql

    mysqldump -u username –p  -d database_name|mysql -u username -p new_database
    

    All tables in will be created in new_database without data.

    0 讨论(0)
  • 2021-01-31 03:11

    Try this one:

    $ mysqldump --no-data -h localhost -u root -p database_name > imported_db_name.sql
    
    0 讨论(0)
  • 2021-01-31 03:12

    You can take backup using mysqldump and restore with mysql using commandline.

    For backup database

    $ mysqldump -u root-pPassword -P3309 --routines --no-data testdb > "d:\dbwithnodata.sql"
    

    For restoration of database

    $ mysql -u root-pPassword -P3309 newdb < "d:\dbwithnodata.sql"
    
    0 讨论(0)
提交回复
热议问题