【问题标题】:Duplicate Entire MySQL Database复制整个 MySQL 数据库
【发布时间】:2010-12-25 16:03:44
【问题描述】:

是否可以在 linux 服务器上复制整个 MySQL 数据库?

我知道我可以使用导出和导入,但原始数据库>25MB,所以这并不理想。

是否可以使用 mysqldump 或直接复制数据库文件?

【问题讨论】:

    标签: mysql database linux


    【解决方案1】:

    我有时会做一个 mysqldump 并将输出通过管道传输到另一个 mysql 命令,以将其导入到不同的数据库中。

    mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
    

    【讨论】:

    • 我得到一个错误,当我使用这个时,dest 数据库不存在。因此,您还需要一个 CREATE DATABASE 行。
    【解决方案2】:

    到远程服务器

    mysqldump mydbname | ssh host2 "mysql mydbcopy"
    

    到本地服务器

    mysqldump mydbname | mysql mydbcopy
    

    【讨论】:

    【解决方案3】:

    首先创建副本数据库:

    CREATE DATABASE duplicateddb;
    

    确保用户和权限都到位并且:

     mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
    

    【讨论】:

    • 我认为第二个命令行的第二部分的“-p”和“密码”之间不应该有空格
    • 不,空间不应该在那里!答案是这样的。 mysql 手册页说: --password[=password], -p[password] 连接到服务器时使用的密码。如果使用短选项形式 (-p),则选项和密码之间不能有空格。如果您在命令行中省略了 --password 或 -p 选项后面的密码值,mysql 会提示输入一个。在命令行上指定密码应该被认为是不安全的。请参阅第 6.1.2.1 节,“P...的最终用户指南”
    • 请注意mysqldump默认备份触发器但不备份存储过程,在这种情况下添加--routines作为选项。
    • 如果您这样做并且您不希望此用户的 MySQL 密码在 bash 历史记录中可用,请在执行后将其从您的 ~/.bash_history 文件中编辑出来。或者你也可以将第一个命令的结果输出到一个临时文件中,然后执行以下命令(会提示你输入密码)mysql -p -u admin duplicatedb < temporaryfile.sql
    • 这个答案当然有效,但问题指出“我知道我可以使用导出和导入,但原始数据库>25MB,所以这并不理想”,这个答案所暗示的基本上是导出和导入。跨度>
    【解决方案4】:

    这是我编写的一个 Windows bat 文件,它结合了 Vincent 和 Pauls 的建议。它会提示用户输入源名称和目标名称。

    只需修改顶部的变量以设置可执行文件/数据库端口的正确路径。

    :: Creates a copy of a database with a different name.
    :: User is prompted for Src and destination name.
    :: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
    :: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.
    
    :: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database
    
    @set MYSQL_HOME="C:\sugarcrm\mysql\bin"
    @set mysqldump_exec=%MYSQL_HOME%\mysqldump
    @set mysql_exec=%MYSQL_HOME%\mysql
    @set SRC_PORT=3306
    @set DEST_PORT=3306
    @set USERNAME=TODO_USERNAME
    @set PASSWORD=TODO_PASSWORD
    
    :: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
    @SET /p USERNAME=Enter database username: 
    @SET /p PASSWORD=Enter database password: 
    @SET /p SRC_PORT=Enter SRC database port (usually 3306): 
    @SET /p DEST_PORT=Enter DEST database port: 
    
    %MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
    @IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript
    
    @SET /p SRC_DB=What is the name of the SRC Database:  
    @SET /p DEST_DB=What is the name for the destination database (that will be created):  
    
    %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
    %mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
    @echo SUCCESSFUL!!!
    @GOTO ExitSuccess
    
    :ExitScript
    @echo "Failed to copy database"
    :ExitSuccess
    

    样本输出:

    C:\sugarcrm_backups\SCRIPTS>copy_db.bat
    Enter database username: root
    Enter database password: MyPassword
    Enter SRC database port (usually 3306): 3308
    Enter DEST database port: 3308
    
    C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sugarcrm_550_pro   |
    | sugarcrm_550_ce    |
    | sugarcrm_640_pro   |
    | sugarcrm_640_ce    |
    +--------------------+
    What is the name of the SRC Database:  sugarcrm
    What is the name for the destination database (that will be created):  sugarcrm_640_ce
    
    C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"
    
    C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
    SUCCESSFUL!!!
    

    【讨论】:

      【解决方案5】:

      这不适用于 InnoDB。 仅当您尝试复制 MyISAM 数据库时才使用此解决方法。

      如果在备份期间锁定表,并且可能在数据库导入期间暂停 MySQL 是可以接受的,mysqlhotcopy 可能会更快。

      例如

      备份:

      # mysqlhotcopy -u root -p password db_name /path/to/backup/directory
      

      恢复:

      cp /path/to/backup/directory/* /var/lib/mysql/db_name
      

      mysqlhotcopy 还可以通过 SSH (scp) 传输文件,并且可能直接传输到重复的数据库目录。

      例如

      # mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name
      

      【讨论】:

        【解决方案6】:

        在具有数据的系统中创建一个mysqldump文件,并使用管道将此mysqldump文件作为新系统的输入。新系统可以使用 ssh 命令连接。

        mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name
        

        -p[密码]之间没有空格

        【讨论】:

        • 您能否添加有关其工作原理的描述,例如管道的用途?
        【解决方案7】:

        制作数据库副本

        # mysqldump -u root -p password db1 > dump.sql
        # mysqladmin -u root -p password create db2
        # mysql -u root -p password db2 < dump.sql
        

        【讨论】:

          【解决方案8】:

          这适用于我的命令提示符,来自 OUTSIDE mysql shell:

          # mysqldump -u root -p password db1 > dump.sql
          # mysqladmin -u root -p password create db2
          # mysql -u root -p password db2 < dump.sql
          

          这对我来说是最好的方法。如果压缩“dump.sql”,您可以将其存储为压缩备份。凉爽的!对于带有 Innodb 表的 1GB 数据库,创建“dump.sql”大约需要一分钟,将数据转储到新的 DB db2 大约需要三分钟。

          直接复制洞 db 目录 (mysql/data/db1) 对我不起作用,我猜是因为 InnoDB 表。

          【讨论】:

            【解决方案9】:

            曾几何时,在 MySQL 中,您可以将所有表文件复制到 mysql 树中的另一个目录

            mysql cli - 创建数据库 db2

            linux cli - cp db1 db2

            【讨论】:

            • 这只适用于 MyISAM,对吧?好的,那些糟糕的过去已经过去了。
            • 历史书不错,但不再有用了。
            【解决方案10】:

            对我来说,以下代码行成功了

            mysqldump --quote-names -q -u username1 --password='password1' originalDB | mysql -u username2 --password='password2' duplicateDB
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-09-18
              • 1970-01-01
              • 1970-01-01
              • 2013-06-11
              • 2015-05-26
              • 2013-06-18
              • 1970-01-01
              相关资源
              最近更新 更多