有没有办法在 MySQL 中复制没有数据的数据库结构,所以新数据库将与从中复制的相同,但有空表。
在得到一些建议后,我尝试了该命令,但出现语法错误,我的username = root
和password = nothing
. 我猜是默认的。我正在尝试以下命令,
mysqldump -u root -p -d xyz_db | mysql -u root -p -Dnew_db
我在命令中缺少或放错了什么?
有没有办法在 MySQL 中复制没有数据的数据库结构,所以新数据库将与从中复制的相同,但有空表。
在得到一些建议后,我尝试了该命令,但出现语法错误,我的username = root
和password = nothing
. 我猜是默认的。我正在尝试以下命令,
mysqldump -u root -p -d xyz_db | mysql -u root -p -Dnew_db
我在命令中缺少或放错了什么?
mysqldump -u user -ppass -d olddb | mysql -u user -ppass -D newdb
新数据库必须已经存在。mysqldump 命令中的-d
标志防止复制数据。
-p
标志和密码之间没有空格。
您可以使用mysqldump进行备份,并使用命令行使用mysql进行恢复。
用于备份数据库
$ mysqldump -u root-pPassword -P3309 --routines --no-data testdb > "d:\dbwithnodata.sql"
用于恢复数据库
$ mysql -u root-pPassword -P3309 newdb < "d:\dbwithnodata.sql"
您可以使用备份 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
没有数据的情况下创建。
来自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
试试这个:
$ mysqldump --no-data -h localhost -u root -p database_name > imported_db_name.sql
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"
正如手册在复制数据库中所说,您可以将转储直接通过管道传输到 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