【问题标题】:How to make a copy of large database from phpmyadmin?如何从 phpmyadmin 复制大型数据库?
【发布时间】:2018-03-09 20:11:09
【问题描述】:

我想在同一台服务器上创建我的网站的开发环境。但我有一个 7Gb 的数据库,其中包含 479 个表,我想将该数据库的副本复制到新数据库。

我已经在PHPmyadmin >> Operations >> copy database to 功能的帮助下尝试过这个。但是每次都会失败并返回错误

Error in processing request Error code: 500 Error text: Internal Error. 

请告诉我还有其他方法/解决方案可以将此数据库从 cpanel 复制到新数据库,请告知

【问题讨论】:

  • 从 phpmyadmin 创建备份。
  • @Twinfriends 已经创建,但是如何设置备份到新数据库
  • 好吧,您已经通过单击“导出”创建了它……那么登录到新数据库呢,单击“导入”并导入您的 sql 文件? ;)
  • 大数据库可以使用终端。
  • @Twinfriends 在进程中间失败给出超时错误

标签: php mysql database phpmyadmin cpanel


【解决方案1】:

创建数据库的导出。这应该可以通过 PhpMyAdmin 界面轻松完成。下载数据库导出后,您需要创建一个新的数据库,您将在其中放置导出的数据。这也应该通过 PhpMyAdmin 用户界面轻松完成。

要上传它,我们不能使用Import -> Browse your computer,因为它有 2MB 的限制。一种解决方案是使用Import -> Select from the web server upload directory /var/lib/phpMyAdmin/upload/。在此目录中上传您导出的数据。之后,您上传的数据应列在其旁边的下拉列表中。

如果这也失败了,您可以使用命令行导入。

mysql -u user -p db_name < /path/to/file.sql

【讨论】:

  • 只有 1 个选项可用,即browse from computer check i.imgur.com/UNqxqYN.png
  • 您必须使用较旧的 phpmyadmin。不要害怕,我更新了我的答案,所以你可以通过命令行上传。
【解决方案2】:

最简单的方法是尝试从 phpmyadmin 中导出数据。它将为您的数据创建备份。

但有时,通过导入/导出传输大量数据确实会导致错误。

您也可以尝试 mysqldump 来备份数据。

我为您找到了一些链接 herehere

这是mysqldump数据库备份documentation

希望对您有所帮助。 :D

【讨论】:

  • 备份后如何恢复?
  • 根据您使用的操作系统,打开 cmd 并导航到转储所在的文件。检查此 SO 链接.. stackoverflow.com/questions/105776/…
  • 我正在使用 cpanel 共享主机,它不会提供那么多权限形式的命令行。
【解决方案3】:

我怀疑 PHPMyAdmin 会处理这种大小的数据库(PHP 上传/下载限制、内存限制、脚本执行时间)。 如果您可以访问控制台,我建议您通过 mysql 命令行进行导出/导入:

导出:

    $ mysqldump -u <user> -p<pass> <liveDatabase> | gzip > export.sql.gz

和导入:

    $ gunzip < export.sql.gz | mysql -u <user> -p<pass> <devDatabase>

在您创建新的开发数据库后,例如PHPMyAdmin 或通过命令行。

否则,如果您只能访问 Apache/PHP 环境,我会寻找一个导出实用程序,将导出分成更小的块。 MySQLDumper 浮现在脑海中,但它已经有几年历史了,AFAIK 不再积极维护它,并且与 PHP 7+ 不兼容。 但我认为至少有一个 pull request 可以使它与 PHP7 一起使用(未经测试)。

根据您的评论进行编辑:

如果导出已经存在并且在导入时发生错误,您可以尝试通过 .htaccess 中的条目来增加 PHP 环境的限制,更改 php.iniini_set,无论您的环境中是否可用.相关设置例如通过.htaccess 进行设置(请记住,这仅适用于带有 mod_php 的 apache 环境,也可以由您的主机控制):

      php_value max_execution_time 3600
      php_value post_max_size 8000M
      php_value upload_max_filesize 8000M
      php_value max_input_time 3600

这可能有效也可能无效,具体取决于 x32/x64 问题和/或您的托管商限制。 此外,您需要调整 ExecTimeLimit 的 PHPmyadmin 设置 - 通常在您的 PHPMyAdmin 安装的 config.default.php 中找到: 替换

      $cfg['ExecTimeLimit'] = 300;

      $cfg['ExecTimeLimit'] = 0;

最后,您可能需要调整 MySQL 配置以允许更大的数据包并摆脱“丢失连接”错误: my.ini 中的 [mysqld] 部分:

      max_allowed_packet=256M

【讨论】:

  • 服务器上已经有该数据库的备份,可以轻松下载,但超时导致无法下载完整文件。
  • 它会给出类似mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table的错误
【解决方案4】:

注意:我刚刚阅读了您的评论,据我所知,您无法访问命令行。请检查Solution Two,这肯定会工作。

唯一对你有用的解决方案(在 12GB 数据库中对我有用)直接来自命令行:

解决方案一

mysql -u root -p

set global net_buffer_length=1000000; --Set network buffer length to a large byte number

set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number

SET foreign_key_checks = 0; --Disable foreign key checking to avoid delays, errors and unwanted behavior

source file.sql --Import your sql dump file

SET foreign_key_checks = 1; --Remember to enable foreign key checks when the procedure is complete!

如果你有 root 访问权限,你可以创建 bash 脚本:

#!/bin/sh 

# store start date to a variable
imeron=`date`

echo "Import started: OK"
dumpfile="/home/bob/bobiras.sql"

ddl="set names utf8; "
ddl="$ddl set global net_buffer_length=1000000;"
ddl="$ddl set global max_allowed_packet=1000000000; "
ddl="$ddl SET foreign_key_checks = 0; "
ddl="$ddl SET UNIQUE_CHECKS = 0; "
ddl="$ddl SET AUTOCOMMIT = 0; "
# if your dump file does not create a database, select one
ddl="$ddl USE jetdb; "
ddl="$ddl source $dumpfile; "
ddl="$ddl SET foreign_key_checks = 1; "
ddl="$ddl SET UNIQUE_CHECKS = 1; "
ddl="$ddl SET AUTOCOMMIT = 1; "
ddl="$ddl COMMIT ; "

echo "Import started: OK"

time mysql -h 127.0.0.1 -u root -proot -e "$ddl"

# store end date to a variable
imeron2=`date`

echo "Start import:$imeron"
echo "End import:$imeron2"

Source

解决方案二

此外,还有另一个选项非常适合那些使用共享主机且没有命令行访问权限的人。此解决方案适用于 4-5GB 文件:

  1. MySQL Dumper:Download(您可以直接从“MySQL Dumper”备份/恢复 SQL 文件,不再需要 phpmyadmin)。
  2. Big Dump:Download(只需从Compress文件和SQL文件恢复,需要BIGDUMP PHP文件编辑才能大导入$linespersession = 3000;改为$linespersession = 30000;

解决方案三:

这个解决方案确实有效,虽然速度慢但有效。

下载试用版(32 位或 64 位):Navicat MySQL Version 12

安装 -> 并作为试用版运行。

之后,将您的计算机 IP(Internet IP,而不是本地 IP)添加到 cPanel 中的 MySQL Remote(新数据库/主机)。您可以在 cPanel 中使用通配符 IP 从任何 IP 访问 MySQL。

转到 Navicat MySQL:点击 Connection 输入连接名称。

在下一个“主机名/IP”中添加您的“主机 IP 地址”(不要使用 localhost)。 保持端口不变(如果您的主机定义了不同的端口,请将其放在这里)。

添加您的数据库用户名密码

点击测试连接,如果成功,点击“确定”

现在在主屏幕上,您将在左侧栏中看到与用户名连接的所有数据库。

双击要导入 SQL 文件的数据库:

数据库的图标颜色会改变,你会看到“表格/视图/函数等”。

现在右键单击 数据库并选择“执行 SQL 文件” (http://prntscr.com/gs6ef1)。 选择文件,如果需要,选择“继续出错”,最后运行它。这需要一些时间,具体取决于您的网络连接速度和计算机性能。

【讨论】:

  • 我也尝试过第二种解决方案,但它会在下载之间失败或仅返回一半数据
  • 哪一个(MySQL Dumper 或 BigDump)?
  • @Narayan try "MySQL Dump" with $linespersession = 30000;,我刚刚添加了解决方案# 3 也试试这个。
  • MySQLDumper:该项目不再维护,处于非活动状态。
【解决方案5】:

你可以使用mysqldump如下

mysqldump —user= —password= --default-character-set=utf8

您也可以使用我的shell脚本,它实际上写了很长时间,用于使用cron作业定期创建MySQL数据库的备份。

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder=“"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump —user= —password= --default-character-set=utf8  | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown  "$fullpathbackupfile"
chown  "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +2 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

我已经在Schedule MySQL Database backup on CPanel or Linux上写了一篇文章。

【讨论】:

    【解决方案6】:

    当我遇到这个问题时,我是这样处理的……不幸的是,这只适用于 Mac OS。

    • 下载Sequel Pro - 完全免费,一年多以来对我来说效果非常好。
    • 远程连接到服务器的数据库。您可能需要将您的 IP 地址添加到 CPANEL 中的“远程 MYSQL”部分。如果您没有凭据,您可以从您网站的配置文件中获取它们。
    • 进入服务器后,您可以选择所有表,再单击,然后选择“导出”>“作为 SQL 转储”。您可能不需要编辑任何设置。点击“导出”。
    • 登录到您的本地服务器数据库,然后从顶部菜单中选择“查询”。
    • 拖放从导出下载的文件,它会自动从 sql 转储设置数据库。

    我希望这会有所帮助。这是一个小问题,但对我来说效果很好,尤其是当 PMA 失败时。

    【讨论】:

      【解决方案7】:

      由于要求包括 PHPMyAdmin,我的建议是:

      1. 选择您需要的数据库
      2. 转到“导出”标签
      3. 点击“自定义 - 显示所有可能的选项”单选按钮
      4. 在“将输出保存到文件”单选按钮选项中,为“压缩:”选择“gzipped”
      5. 删除“显示 cmets”勾选(以节省一些空间)
      6. 完成导出

      然后尝试将生成的文件导入您拥有的新数据库中(如果您有足够的资源 - 这应该是可能的)。

      注意:我之前的经验表明,使用压缩允许更大的数据库导出/导入操作,但尚未测试共享主机环境中的上限是多少(假设您对 cPanel 的评论是这样)。

      编辑:创建导出文件后,选择新数据库(假设它已经创建),转到“导入”选项卡,选择从导出创建的文件并开始导入过程。

      【讨论】:

        【解决方案8】:

        仅限于 phpMyAdmin?不要一次完成所有操作

        不应转储大型数据集(除非用于备份),而是导出数据库没有数据,然后一次复制一个表( DB 到 DB 直接)。

        导出/导入架构

        首先,通过 phpMyAdmin 导出数据库schema(取消选中导出选项中的data)。然后将其导入到新的数据库名称中。

        或者,一旦您创建了数据库,您可以使用类似下面的内容来生成类似下面的语句。这种方法的问题是您可能会丢失约束、存储过程等。

        CREATE TABLE [devDB].[table] LIKE [prodDB].[table]

        复制数据,一次一个表。

        使用一个好的编辑器来创建你需要的 470 个插入语句。从一个表名列表开始,然后使用好的旧的 find-and-replace。

        INSERT INTO [devDB].[table] SELECT * FROM [prodDB].[table];

        可能窒息,具体取决于您的环境。如果 确实,删除并重新创建 dev 数据库(或通过 phpMyAdmin 清空所有表)。然后,一次运行几个表的INSERT 命令。

        数据库管理需要 CLI

        您在这里面临的真正问题是您试图在不访问命令行界面的情况下进行数据库管理。高效迁移大型数据集有很多复杂的细节,其中大部分只能使用 mysqldump 之类的工具来解决。

        【讨论】:

          【解决方案9】:

          如果您在本地服务器中有数据库,则可以将其导出并使用 BigDump 插入到全局服务器上的新数据库BigDump

          【讨论】:

            猜你喜欢
            • 2017-10-10
            • 2013-05-05
            • 2014-02-12
            • 1970-01-01
            • 2023-03-26
            • 2011-03-23
            • 2012-12-18
            • 2016-07-16
            相关资源
            最近更新 更多