删除Ubuntu服务器上80GB MySQL数据库遇连接中断,求手动移除方案
处理无法删除大MySQL数据库的问题
先给你敲个警钟:手动修改MySQL系统表来删除数据库是风险极高的操作——除非你对MySQL内部架构门儿清,否则很容易搞崩整个数据库实例,到时候恢复起来比删库还麻烦。所以咱们先优先解决连接中断的问题,用安全的方式删库;真到万不得已,再考虑手动清理的路子,而且必须步步小心。
一、先搞定连接中断的问题
你遇到的连接中断,大概率是因为删80GB的大库需要大量时间和资源,触发了超时或者资源耗尽。试试这几个办法:
- 延长MySQL连接超时时间:临时调大超时参数,给删库操作足够的时间。登录MySQL CLI后执行:
这是临时生效的,重启MySQL就没了;要是想永久生效,编辑SET GLOBAL wait_timeout = 3600; SET GLOBAL interactive_timeout = 3600; SET GLOBAL lock_wait_timeout = 1800;/etc/mysql/my.cnf(或者/etc/mysql/mysql.conf.d/mysqld.cnf,取决于Ubuntu版本),把这几个参数加进去,然后重启服务。 - 确保服务器资源够用:删大库会吃满磁盘IO和CPU,先用
iostat看IO使用率,htop看CPU负载。如果资源被占满,先停掉非必要的服务,或者等低峰时段再操作——毕竟大半夜服务器闲着的时候,删库成功率高多了。 - 后台执行删库命令:避免终端连接超时导致操作中断。用
nohup把命令丢后台跑:
把nohup mysql -u root -p -e "DROP DATABASE your_database_name;" > /dev/null 2>&1 &your_database_name换成你要删的库名就行,这样哪怕你关掉终端,命令还在后台跑。
二、如果安全方式行不通,试试手动清理(极度谨慎!)
要是上面的办法都不管用,那只能走手动清理的路子,但必须先备份整个MySQL实例!比如用mysqldump --all-databases > full_backup.sql把所有库都备份一遍,不然出问题哭都来不及。
步骤如下:
- 先停掉MySQL服务:
sudo systemctl stop mysql - 删除数据库的物理文件:
MySQL的数据默认存在/var/lib/mysql/,找到对应库的文件夹(名字就是库名),直接删:sudo rm -rf /var/lib/mysql/your_database_name - 清理系统表中的残留记录:
启动MySQL到安全模式(跳过权限检查和网络连接),这样才能修改系统表:
然后登录MySQL:sudo mysqld_safe --skip-grant-tables --skip-networking &
接下来删系统表的相关记录:mysql -u root- 删掉
mysql.db里的库条目:DELETE FROM mysql.db WHERE Db = 'your_database_name'; - 删掉权限相关的记录:
DELETE FROM mysql.tables_priv WHERE Db = 'your_database_name'; DELETE FROM mysql.columns_priv WHERE Db = 'your_database_name'; - 刷新权限:
FLUSH PRIVILEGES;
- 删掉
- 重启MySQL到正常模式:
先停掉安全模式的进程:
再正常启动:sudo systemctl stop mysqlsudo systemctl start mysql - 检查磁盘空间:
用df -h看看磁盘空间是不是已经释放了。
三、额外提醒(很重要!)
- 要是你的MySQL用的是InnoDB引擎,还得确认
innodb_file_per_table是不是开启的:
如果值是SHOW VARIABLES LIKE 'innodb_file_per_table';ON,那删了库的文件夹就能回收空间;如果是OFF,那删除库后,共享表空间文件ibdata1不会自动缩小,这时候要回收空间就得重建整个InnoDB表空间,步骤更复杂,建议先查清楚这个参数的状态。 - 手动改系统表真的很容易翻车,比如误删其他库的记录,导致权限混乱或者实例启动不了,所以备份是必须的!
内容的提问来源于stack exchange,提问作者smccloud
相关产品推荐
相关产品推荐

