在mysql中复制没有数据的数据库结构(带有空表)

时间:2013-01-01 04:57:40

标签: mysql copy database-schema

有没有办法在MySQL中没有数据的情况下复制数据库结构,因此新数据库将与从中复制的数据库相同,但是使用空表。

在得到一些建议后我尝试了命令,但是我收到语法错误,我的username = rootpassword = nothing。我猜是默认的。我正在尝试按照命令,

mysqldump -u root -p -d xyz_db | mysql -u root -p -Dnew_db

我缺少什么或在命令中错位?

7 个答案:

答案 0 :(得分:61)

mysqldump -u user -ppass -d olddb | mysql -u user -ppass -D newdb

新数据库必须已存在。 mysqldump命令中的-d标志可防止复制数据。

标志-p和密码之间没有空格。

答案 1 :(得分:8)

您可以使用 mysqldump 进行备份,并使用命令行使用 mysql 进行恢复。

对于备份数据库

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

恢复数据库

$ mysql -u root-pPassword -P3309 newdb < "d:\dbwithnodata.sql"

答案 2 :(得分:1)

来自electrictboolbox.com/mysqldump-schema-only

转储没有数据的所有表的数据库结构 添加-d标志表示输出中不应包含任何数据,其中“mydatabase”是要转储的数据库的名称,“someuser”是用于连接数据库的登录名。以下命令将转储指定MySQL数据库中所有表的表结构:

$ mysqldump -d -u someuser -p mydatabase

-d标志表示不在转储中包含数据。或者,如果您发现更容易记住,则可以使用--no-data:

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

-u标志表示将提供密码的用户名和-p标志。按下后,系统将提示您输入密码。

或者,可以在命令行上提供密码,但-p标志和密码之间不能有空格。例如,如果密码是“apples”,请执行以下操作:

$ mysqldump --no-data -u someuser -papples mydatabase
$ mysqldump -d -u someuser -p mydatabase > mydatabase.sql # This will output to a sql file

答案 3 :(得分:1)

您可以使用

备份MYSQL数据库结构
mysqldump -u username –p  -d database_name > backup.sql

(您不应该在命令行提供密码,因为它会导致安全风险。默认情况下,MYSQL会要求输入密码。) 您可以使用

在数据库中创建创建表
mysql -u username -p new_database < backup.sql

现在您可以使用pipe将第一个命令的输出作为第二个命令的输出,您将不再需要backup.sql

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

所有表格都将在new_database中创建,不含数据。

答案 4 :(得分:1)

试试这个:

$ mysqldump --no-data -h localhost -u root -p database_name > imported_db_name.sql

答案 5 :(得分:0)

mysqldump -d是不够的,因为在TRIGGERS,PROCEDURES等中,您可以使用诸如'old_db'.tb_name之类的引用,而这些引用必须替换为'new_db'.tb_name

#./db_clone.sh old_db new_db

我使用带有凭据的文件/root/.mysqlcnx(而不是使用-u root -pPass)

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

和以下用于克隆数据库的脚本 [在虚拟机上进行实验以增强信心]

#!/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"

注意:懂bash的人请在必要时纠正我

答案 6 :(得分:0)

正如手册在复制数据库中所说,您可以将转储直接通过管道传输到 mysql 客户端:

mysqldump db_name | mysql new_db_name 

如果您使用的是 MyISAM,您可以复制文件,但我不建议这样做。有点不靠谱。

整合了各种其他好的答案

mysqldump 和 mysql 命令都接受用于设置连接详细信息(以及更多)的选项,例如:

mysqldump -u <user name> --password=<pwd> <original db> | mysql -u <user name> -p <new db>

示例:mysqldump -u root -pmypassword old_database | mysql -u root -pmypassowrd new_database

bloglink