49

有没有办法在 MySQL 中复制没有数据的数据库结构,所以新数据库将与从中复制的相同,但有空表。

在得到一些建议后,我尝试了该命令,但出现语法错误,我的username = rootpassword = nothing. 我猜是默认的。我正在尝试以下命令,

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

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

4

7 回答 7

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

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

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

于 2013-01-01T04:59:07.157 回答
10

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

用于备份数据库

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

用于恢复数据库

$ mysql -u root-pPassword -P3309 newdb < "d:\dbwithnodata.sql"
于 2013-01-01T05:40:43.450 回答
3

您可以使用备份 MYSQL 数据库结构

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

(你不应该在命令行提供密码,因为它会导致安全风险。MYSQL 默认会要求输入密码。)你可以在数据库中创建创建表

mysql -u username -p new_database < backup.sql

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

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

中的所有表都将在new_database没有数据的情况下创建。

于 2013-09-09T16:58:48.173 回答
2

来自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
于 2013-01-01T05:00:23.533 回答
1

试试这个:

$ mysqldump --no-data -h localhost -u root -p database_name > imported_db_name.sql
于 2018-02-08T09:43:32.253 回答
0

mysqldump -d还不够,因为在触发器、程序等中,您可以将类似'old_db'.tb_name的引用替换为'new_db'.tb_name

mysql -u user -ppass -e "CREATE DATABASE new_db" 

mysqldump -u user -ppass -d old_db |     # pull structure  -d flag  
sed "s/\`old_db\`\./\`new_db\`\./g" |    # solve foreign_keys, triggers etc 
sed 's/AUTO_INCREMENT=[0-9]\+/''/g' |    # reset indexes
mysql -u user -ppass new_db              # push structure

下面是一个 bash 脚本,它还创建目标数据库并执行一些检查

# ./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"
于 2020-09-25T23:34:16.173 回答
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

博客链接

于 2021-05-14T06:55:47.817 回答