【问题标题】:copy database structure without data in mysql (with empty tables)在mysql中复制没有数据的数据库结构(带有空表)
【发布时间】:2012-12-15 23:39:55
【问题描述】:

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

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

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

我在命令中遗漏或放错了什么?

【问题讨论】:

    标签: mysql copy database-schema


    【解决方案1】:
    mysqldump -u user -ppass -d olddb | mysql -u user -ppass -D newdb
    

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

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

    【讨论】:

    • 我收到语法错误,我的用户名是root,密码什么都不是,这是我的命令,mysqldump -u root -p -d xyz_db | mysql -u root -p -Dnew_db。我的命令有问题吗?
    • 如果您能在此处排除密码并在提示时输入密码,那就太好了
    • @jimmcnamara 是否可以将其输出到.sql 文件?比如mysqldump -u user -ppass -d olddb | mysql -u user -ppass -Dnewdb > newdb.sql?
    • MySQL 服务器返回一条以“DROP command denied to user”开头的错误消息,这在复制操作时是无意义的。为什么在创建新数据库时 DROP ?论据一定有问题。我投了反对票,因为可能不需要 DROP 权限,解决方案是添加您应该已经包含的“--skip-add-drop-table”参数。
    • 你可能需要使用 -h 参数在不同主机之间复制
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      用于备份数据库

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

      用于恢复数据库

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

      【讨论】:

      • 使用testdb.tb_name 的触发器和例程存在问题,因此在第 2 步之前必须:[#bash sed -i 's/testdb/newdb/g' dbwithnodata.sql]跨度>
      【解决方案4】:

      你可以备份你的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 中创建,没有数据。

      【讨论】:

        【解决方案5】:

        试试这个:

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

        【讨论】:

          【解决方案6】:

          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"
          

          【讨论】:

            【解决方案7】:

            正如手册在复制数据库中所说,您可以将转储直接通过管道传输到 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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-06-15
              • 2019-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多