自动删除MYSQL死连接(Sleep)

本文介绍了一种通过PHP脚本自动清理MySQL中长时间处于睡眠状态的空闲连接的方法,并提供了具体的实现代码。用户可以根据需要调整参数,如设置密码和空闲时间阈值,并通过计划任务定期运行此脚本来保持数据库连接池的健康。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<? php
define ( ' MAX_SLEEP_TIME ' ,   120 );
 
$hostname   =   " localhost " ;
$username   =   " root " ;
$password   =   " password " ;
 
$connect   =   mysql_connect ( $hostname ,   $username ,   $password );
$result   =   mysql_query ( " SHOW PROCESSLIST " ,   $connect );
while  ( $proc   =   mysql_fetch_assoc ( $result )) {
    
if  ( $proc [ " Command " ==   " Sleep "   &&   $proc [ " Time " >  MAX_SLEEP_TIME) {
        @
mysql_query ( " KILL  "   .   $proc [ " Id " ] ,   $connect );
    }
}
mysql_close ( $connect );
?>

 

将它当中的 $password 改成你实际的数据库密码,死连接的时间也可以修改。然后加入计划任务就可以了。比如用 crontab -e 命令加入:

*/2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php
### 如何跳过 MySQL Server 8.0 的密码验证以重置或绕过密码 当遇到忘记 MySQL Server 8.0 的 `root` 用户密码的情况时,可以通过特定的方式跳过密码验证并重新设置新密码。以下是具体的操作说明: #### 方法一:通过配置文件跳过权限表 如果可以访问服务器上的配置文件,则可以在 MySQL 配置文件中临时禁用授权表功能。 1. **停止 MySQL 服务** 停止当前正在运行的 MySQL 服务: ```bash sudo systemctl stop mysqld ``` 2. **编辑 my.cnf 文件** 找到 MySQL 的配置文件(通常位于 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`),并在 `[mysqld]` 下添加以下参数: ```ini skip-grant-tables ``` 这样可以让 MySQL 跳过权限表验证。 3. **重启 MySQL 服务** 使用以下命令重启 MySQL 服务: ```bash sudo systemctl start mysqld ``` 4. **无密码登录 MySQL 并修改密码** 此时可以直接使用 `mysql -u root` 登录而无需提供密码。随后执行 SQL 查询更新密码: ```sql ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES; ``` 上述语句用于更改 `root` 用户的密码[^2]。 5. **移除 skip-grant-tables 参数** 编辑 `my.cnf` 文件,删除之前添加的 `skip-grant-tables` 行,并再次重启 MySQL 服务以恢复正常操作模式。 --- #### 方法二:不依赖配置文件的情况下手动启动 MySQL 实例 对于某些环境可能不存在可编辑的配置文件或者无法直接修改它,此时可通过命令行指定选项来实现相同效果。 1. **终止现有进程** 如果有其他实例正在运行,请先将其关闭: ```bash ps aux | grep mysqld kill <PID> ``` 2. **手动启动 MySQL 不加载授权表** 利用如下指令启动一个新的 MySQL 实例而不读取权限数据: ```bash mysqld_safe --skip-grant-tables & ``` 3. **连接数据库并调整账户凭证** 类似前面提到的过程,利用客户端工具进入管理界面完成必要的变更工作。 4. **结束特殊状态下的守护程序** 当所有改动完成后记得正常退出自定义启动的服务形式恢复常规运作流程。 上述两种途径均能有效处理因遗忘管理员级认证字符串所引发的一系列麻烦状况[^4]。 ```python # 示例 Python 脚本展示如何自动化部分过程 (仅作参考用途) import subprocess def reset_mysql_password(): try: # Step 1: Stop the service subprocess.run(["sudo", "systemctl", "stop", "mysqld"], check=True) # Step 2: Start with skip grant tables option subprocess.Popen(["mysqld_safe", "--skip-grant-tables"]) # Wait a moment to ensure it's up and running before connecting again. import time; time.sleep(5) # Step 3: Connect without password & change credentials via CLI commands inside here... new_pass = input("Enter New Password:") alter_query = f"ALTER USER 'root'@'localhost' IDENTIFIED BY '{new_pass}';" flush_privileges = "FLUSH PRIVILEGES;" conn_command = ["mysql", "-uroot"] proc_conn = subprocess.Popen(conn_command, stdin=subprocess.PIPE, text=True) proc_conn.communicate(f"{alter_query}\n{flush_privileges}") if proc_conn.returncode != 0: raise Exception("Failed altering user.") except Exception as e: print(e) finally: # Ensure cleanup happens even on error paths too. subprocess.call(['killall', '-v', 'mysqld']) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值