有没有办法在MySQL中没有数据的情况下复制数据库结构,因此新数据库将与从中复制的数据库相同,但是使用空表。
在得到一些建议后我尝试了命令,但是我收到语法错误,我的username = root
和password = nothing
。我猜是默认的。我正在尝试按照命令,
mysqldump -u root -p -d xyz_db | mysql -u root -p -Dnew_db
我缺少什么或在命令中错位?
答案 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