我的知识记录

数据库Too many connections_连接数满排查与调优

数据库连接错误排查。数据库连接是网站运行的基础,连接失败网站直接报错。常见连接错误:1.Connection refused(连接被拒绝)——a.MySQL服务没启动(service mysql status,没启动就启动,启动失败看错误日志);b.端口没监听(MySQL没监听3306,netstat -tlnp | grep 3306,检查my.cnf port=3306、skip-networking没开);c.防火墙拦截(服务器防火墙/云安全组没开3306,本地连接不需要开,远程连接要开);d.端口被改(MySQL监听端口不是3306,看my.cnf port配置,程序配置对应端口)。解决:确认MySQL运行+端口监听+防火墙(远程连接)。2.Access denied for user 'user'@'host'(访问被拒)——a.密码错(数据库用户密码不对,重置密码:SET PASSWORD FOR 'user'@'localhost'=PASSWORD('新密码'); 或mysqladmin -u用户 -p旧密码 password 新密码);b.用户不存在(用户没创建,CREATE USER 'user'@'localhost' IDENTIFIED BY '密码'; GRANT ALL ON 库.* TO 'user'@'localhost'; FLUSH PRIVILEGES;);c.主机不匹配(用户只能从localhost连接,但程序从127.0.0.1或远程IP连接,创建对应host的用户:'user'@'127.0.0.1'或'user'@'%'(允许所有IP,不安全)或指定IP);d.权限不足(用户没有该库权限,GRANT ALL PRIVILEGES ON 库.* TO 'user'@'host'; FLUSH PRIVILEGES;);e.密码含特殊字符(配置文件中密码含#/!/@等没加引号,加引号或改密码);f.密码哈希方式不兼容(MySQL 8.0默认caching_sha2_password,老客户端不支持,改mysql_native_password:ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';)。解决:确认用户存在+密码对+主机匹配+权限足够,用mysql -u用户 -p密码 -h地址测试。3.Can't connect to MySQL server on 'host' (110/111)——远程连接超时/被拒。a.MySQL bind-address=127.0.0.1(只允许本地连接,远程连不上,改my.cnf bind-address=0.0.0.0或注释掉,重启MySQL);b.防火墙/安全组没开3306(开放端口,或只允许应用服务器IP访问更安全);c.网络不通(服务器间网络不通,ping/telnet host 3306测试);d.MySQL没启动(同Connection refused)。解决:改bind-address+开防火墙+测试网络。4.Error establishing a database connection(WordPress等程序)——综合连接失败,见上面1-3排查,先命令行测试连接区分是程序还是数据库问题。5.MySQL server has gone away(服务器断开)——a.连接超时(wait_timeout/interactive_timeout太短,长连接被断开,调大wait_timeout=28800);b.数据包太大(max_allowed_packet太小,大查询/大插入被断开,调大max_allowed_packet=64M);c.MySQL崩溃/重启(服务中途重启,看错误日志,修复崩溃原因);d.网络中断(网络抖动断开,程序用重连机制);e.PHP mysqli.reconnect=Off(断开后不自动重连,开mysqli.reconnect=On或程序手动重连)。解决:调大wait_timeout/max_allowed_packet+程序加重连+看MySQL是否崩溃。连接错误排查核心:先命令行mysql -u用户 -p密码 -h地址 库名测试(能连接=程序配置问题,不能连接=数据库服务/网络/权限问题),看错误提示(Access denied/Connection refused/timeout对应不同原因),逐项排查。

数据库乱码、慢查询、备份恢复、日常维护。乱码问题:数据库中文乱码(问号/方块/乱码字符)是字符集不统一导致。1.统一字符集——数据库/表/字段/连接/PHP/HTML都用UTF-8(推荐utf8mb4,支持emoji和完整UTF-8)。a.数据库:CREATE DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 已有库ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; b.表:CREATE TABLE 表 (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 已有表ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; c.字段:字符字段(varchar/text)排序规则utf8mb4_unicode_ci,DESCRIBE 表看;d.连接:PHP连接后SET NAMES utf8mb4; 或PDO DSN加charset=utf8mb4,mysqli_set_charset($conn,'utf8mb4'); e.PHP文件:UTF-8无BOM编码(编辑器设置);f.HTML:,header('Content-Type: text/html; charset=utf-8'); g.MySQL配置:my.cnf [mysqld] character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci、[client] default-character-set=utf8mb4。2.乱码类型——a.中文变问号?:数据写入时连接字符集不对,信息已丢失(无法恢复,重新录入或从备份恢复),修复连接字符集防止新数据继续乱;b.中文变中文(UTF-8被按latin1显示):双重编码,可以修复——把字段按latin1读取转utf8写入,UPDATE 表 SET 字段=CONVERT(CAST(CONVERT(字段 USING latin1) AS BINARY) USING utf8mb4); (先备份测试);c.中文变方块□:字体不支持生僻字/emoji,用utf8mb4+支持的字体(微软雅黑/思源黑体);d.emoji变?:数据库用utf8(3字节,不支持4字节emoji),转utf8mb4(ALTER TABLE CONVERT TO CHARACTER SET utf8mb4),已损坏的emoji无法恢复重新录入。乱码预防:所有环节统一utf8mb4,迁移数据库时确认导出导入编码(phpMyAdmin导出选utf8,导入目标库utf8mb4)。慢查询优化:慢查询影响网站性能和数据库稳定性。1.开启慢查询日志——my.cnf [mysqld] slow_query_log=1、slow_query_log_file=/var/log/mysql/slow.log、long_query_time=2(超过2秒记录),重启MySQL。2.分析慢查询——mysqldumpslow /var/log/mysql/slow.log(汇总慢查询),或pt-query-digest(Percona工具,更详细),看哪些SQL慢、执行次数、锁定时间。3.优化方法——a.加索引:WHERE/ORDER BY/JOIN/GROUP BY字段加索引(ALTER TABLE 表 ADD INDEX 索引名(字段)),用EXPLAIN SELECT ...看是否走索引(type=ALL是全表扫描,要优化),避免索引失效(函数/隐式转换/前导通配符LIKE '%xx');b.优化SQL:避免SELECT *(只查需要的字段)、避免大表JOIN(减少JOIN表数/加索引)、分页用延迟关联(大表OFFSET慢,SELECT * FROM 表 WHERE id IN (SELECT id FROM 表 LIMIT 10000,10))、用COUNT(*)代替COUNT(字段)(InnoDB中COUNT(*)优化)、避免在循环中查数据库(N+1查询,用JOIN一次查);c.表结构优化:大表分表(按时间/ID分表,单表超过500万行考虑分表)、字段类型合理(INT不用BIGINT、VARCHAR长度合理、不用TEXT存常用数据)、用InnoDB(支持事务/行锁/崩溃恢复);d.缓存:热点数据缓存(Redis/Memcached,减少数据库查询)、程序缓存(页面缓存/数据缓存);e.读写分离:读多写少用主从复制,读操作走从库,写走主库;f.硬件升级:CPU/内存/SSD(SSD比HDD快很多),innodb_buffer_pool_size设为物理内存50-70%。备份与恢复:备份是数据库安全的最后防线。1.备份方法——a.mysqldump(逻辑备份,最常用):mysqldump -u用户 -p密码 --single-transaction --default-character-set=utf8mb4 --routines --triggers 库名 > backup_日期.sql(--single-transaction InnoDB不锁表,--routines存储过程,--triggers触发器),大库加--quick逐行读取;b.phpMyAdmin导出(图形界面,适合小库,大库可能超时);c.物理备份(xtrabackup,InnoDB热备份,不锁表,适合大库,恢复快);d.自动备份(crontab定时执行mysqldump脚本,每天备份,保留多版本,上传云存储)。2.备份注意——a.备份前确认数据库正常(没有表损坏);b.备份文件压缩(gzip backup.sql减小体积);c.备份加密(含敏感数据,gpg加密);d.异地备份(上传云存储/另一台服务器,不要只存在同一台);e.保留多版本(7天每天+4周每周+3月每月);f.定期恢复演练(每季度测试恢复一次,确认备份可用)。3.恢复方法——a.mysql命令行:mysql -u用户 -p密码 库名 < backup.sql(大库用source backup.sql在mysql交互中);b.phpMyAdmin导入(小库,大库可能超时,用BigDump分块导入或命令行);c.物理恢复(xtrabackup --prepare + --copy-back,适合物理备份);d.恢复注意:恢复会覆盖当前数据,恢复前备份当前数据;大库恢复可能耗时,低峰期操作;恢复后测试数据完整性(表数/行数/抽样数据);字符集确认(备份和目标库字符集一致utf8mb4)。日常维护:1.每日——检查MySQL服务运行、错误日志(有没有ERROR/WARNING)、慢查询(有没有新增慢SQL)、磁盘空间(数据目录/binlog)、连接数(SHOW PROCESSLIST);2.每周——优化表(OPTIMIZE TABLE 表名,碎片整理,适合MyISAM和InnoDB)、检查备份(自动备份是否正常,文件大小/时间)、清理旧binlog(PURGE BINARY LOGS BEFORE '日期',不要直接rm)、慢查询优化(分析慢日志优化TOP慢SQL);3.每月——检查用户权限(有没有未知用户/过度权限)、检查数据库安全(远程访问/弱密码/端口)、升级MySQL安全补丁、检查索引使用情况(有没有无用索引/缺失索引)、容量规划(数据增长趋势,是否需要扩容/分表);4.每季度——备份恢复演练、全面安全审计、性能评估、升级规划。数据库是网站核心,数据安全第一,做好备份+优化+安全+日常维护,数据库稳定高效运行。

数据库常见错误与解决。1.Unknown database 'dbname'(未知数据库)——配置的数据库名不存在。解决:SHOW DATABASES;看有哪些库,创建数据库CREATE DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,或修正程序配置中的库名(拼写错/大小写,Linux区分大小写)。2.Table 'db.table' doesn't exist(表不存在)——a.表名错(拼写错/大小写,Linux区分大小写,修正表名);b.表被删(误删/被黑删除,从备份恢复表结构和数据);c.没导入(迁移数据库时只导入了部分表,重新导入完整备份);d.表前缀错(程序配置表前缀和实际表前缀不一致,如程序用wp_但实际是wp2_,修正配置$table_prefix)。解决:SHOW TABLES;看表,修正表名/前缀,从备份恢复缺失表。3.Unknown column 'col' in 'field list'(字段不存在)——a.字段名错(拼写错/大小写,修正);b.字段被删(误删,从备份恢复或ALTER TABLE添加);c.程序升级需要新字段但没加(运行升级脚本/数据库升级,或手动ALTER TABLE 表 ADD COLUMN 字段 类型 约束;);d.表前缀错(同表不存在)。解决:DESCRIBE 表名;看字段,修正字段名,添加缺失字段(注意字段类型/默认值/位置)。4.Duplicate entry 'x' for key 'y'(重复键值)——插入/更新数据违反主键或唯一索引约束。a.数据重复(插入已存在的ID/唯一值,检查数据,用INSERT IGNORE忽略重复或ON DUPLICATE KEY UPDATE更新);b.自增ID冲突(AUTO_INCREMENT值小于现有最大ID,ALTER TABLE 表 AUTO_INCREMENT=最大值+1);c.唯一索引设计不合理(不该唯一的字段设了唯一,删除唯一索引或改设计);d.导入重复数据(导入备份时表已有数据,先清空表或用REPLACE/INSERT IGNORE)。解决:检查重复数据,调整插入逻辑,修正自增ID/索引设计。5.Syntax error near 'xxx'(SQL语法错)——SQL语句语法错误。a.关键字拼写错(SELEC/INSER/WHRER,修正关键字);b.引号不配对(字符串引号没闭合,检查引号);c.保留字用作字段名(order/key/group等保留字,用反引号`order`包裹或改字段名);d.缺少逗号/括号(字段间缺逗号,括号不闭合,检查语法);e.中文标点(用了中文逗号/引号,改英文标点)。解决:看错误信息指出的位置(near 'xxx'),检查附近SQL语法,用phpMyAdmin/Navicat测试SQL。6.Lock wait timeout exceeded(锁等待超时)——事务等待锁超过innodb_lock_wait_timeout(默认50秒)。a.长事务占用锁(大事务/未提交事务锁住行/表,SHOW PROCESSLIST看长事务,KILL掉);b.并发更新同一行(高并发更新同一记录,优化程序减少冲突/加队列);c.索引缺失导致全表锁(没索引更新全表扫描锁很多行,加索引);d.表级锁(MyISAM表锁,并发低,改InnoDB)。解决:SHOW PROCESSLIST看长事务KILL,加索引,优化事务(短事务/及时提交),调大innodb_lock_wait_timeout(临时)。7.Deadlock found when trying to get lock(死锁)——两个事务互相等待对方锁。a.事务顺序不一致(A事务锁表1再锁表2,B事务锁表2再锁表1,统一事务加锁顺序);b.长事务+并发(长事务持锁时间长,容易死锁,缩短事务);c.索引缺失(全表扫描锁多行,加索引)。解决:看死锁日志(SHOW ENGINE INNODB STATUS;),统一事务加锁顺序,缩短事务,加索引,程序加重试机制(死锁后重试)。8.MySQL server has gone away——见连接错误。9.Out of memory(内存不足)——MySQL内存不足崩溃/OOM。a.innodb_buffer_pool_size太大(超过系统内存,调小到物理内存50-70%);b.连接数太多(每个连接占内存,max_connections太大,调小或加内存);c.大查询/大排序(内存临时表,优化SQL/加索引);d.系统内存不足(其他进程占内存,free -h看,加内存/swap/优化其他进程)。解决:调小innodb_buffer_pool_size/max_connections,优化SQL,加内存/swap。数据库错误排查原则:看错误信息(指出原因+位置)→看MySQL错误日志(最详细)→测试SQL/连接→检查配置/数据→修复,数据相关错误(表/字段/数据丢失)先备份再操作,不要直接删/改。

技术评价:「数据库错误排查核心是『看错误信息+看错误日志+测试』。连接错误先命令行mysql测试(能连=程序配置问题,不能连=服务/网络/权限),Access denied查用户/密码/主机/权限,Connection refused查服务/端口/防火墙,gone away查超时/包大小/服务崩溃。表/字段不存在(没导入/名错/前缀错),重复键(数据重复/自增ID/索引设计),语法错(关键字/引号/保留字),锁等待/死锁(长事务/索引缺失/事务顺序)。乱码统一utf8mb4(数据库/表/连接/PHP/HTML全链路),问号是数据已丢,双重编码可修复。慢查询开慢日志+EXPLAIN分析+加索引+优化SQL+缓存,90%慢查询是缺索引。备份用mysqldump+自动+异地+多版本+恢复演练,数据是核心,备份是底线。日常维护(每日检查服务/日志/空间,每周优化/备份/慢查询,每月安全/权限/容量)。数据库错误不要慌,按流程看日志+测试+修复,数据相关先备份再操作,不要盲目删数据/重装」「给客户运维数据库,常见问题:连接失败(搬服务器没改配置/MySQL没启)、乱码(字符集不统一)、慢查询(没索引/大表)、连接数满(max_connections太小/慢查询占连接/攻击)、磁盘满(binlog/备份没清理)、备份失败(超时/权限)。预防:统一utf8mb4、关键表加索引、监控连接数/磁盘/慢查询、自动备份+异地+演练、定期优化表+清理binlog、max_connections合理设置。做好这些,数据库稳定少出问题」。

经验总结:数据库是网站的核心(数据存储),数据库错误是最严重的网站错误(数据库挂了网站完全不可用,数据丢了可能无法恢复),核心经验:1.数据安全第一——任何数据库操作前备份,危险SQL先测试+事务+LIMIT,不要盲目删数据/重装,数据是企业核心资产,丢了损失大;2.看错误日志——MySQL错误日志(/var/log/mysql/error.log)记录最详细的错误原因+SQL+时间,比瞎猜快10倍,启动失败/崩溃/死锁/慢查询都要先看日志;3.命令行测试区分问题——mysql -u用户 -p密码测试连接(能连=程序配置问题,不能连=数据库/网络/权限),在mysql命令行执行SQL测试(能执行=程序代码问题,不能执行=SQL/数据/权限问题),测试法快速定位;4.常见原因记牢——连接错误(服务没启/配置错/权限/网络)、表/字段不存在(没导入/名错/前缀错)、重复键(数据重复/自增ID/索引)、乱码(字符集不统一,全链路utf8mb4)、慢查询(缺索引/SQL差,加索引+优化)、连接数满(max_connections/慢查询/攻击)、锁/死锁(长事务/索引/事务顺序)、启动失败(配置/权限/磁盘/内存/数据损坏);5.备份是最后防线——mysqldump每天备份+压缩+加密+异地存储+多版本保留+每季度恢复演练,备份不可用=没有备份,恢复演练必须做;6.性能优化核心是索引——90%慢查询是缺索引,WHERE/ORDER BY/JOIN字段加索引,EXPLAIN看执行计划,避免索引失效,配合SQL优化(避免SELECT */大表JOIN/N+1查询)+缓存(Redis/页面缓存)+合理配置(innodb_buffer_pool_size=内存50-70%);7.字符集统一utf8mb4——数据库/表/字段/连接/PHP文件/HTML全链路utf8mb4(支持emoji和完整UTF-8),迁移数据库确认导出导入编码,乱码早发现早修(问号数据已丢无法恢复);8.权限最小化——应用用户只给必要权限(SELECT/INSERT/UPDATE/DELETE),root只本地,3306不对外开放,强密码,减少被黑风险和误操作影响;9.日常维护制度化——每日(服务/日志/磁盘/连接数)、每周(优化表/备份检查/清理binlog/慢查询优化)、每月(用户权限/安全/容量/索引)、每季度(恢复演练/安全审计/性能评估),定期维护减少突发错误;10.不要慌——数据库错误大部分是配置/权限/SQL小问题,按流程10-30分钟解决,严重问题(数据损坏/被黑)先备份+看日志+找专业人,有备份就能恢复,慌了容易误操作(删数据/乱改配置)加重问题;11.工具熟练用——mysql命令行(连接/执行SQL/管理)、mysqldump(备份)、phpMyAdmin/Navicat(图形管理)、EXPLAIN(分析执行计划)、mysqldumpslow/pt-query-digest(慢查询分析)、SHOW PROCESSLIST(看连接)、SHOW ENGINE INNODB STATUS(死锁/事务)、tail -f error.log(实时日志),这些工具熟练用,排查效率高;12.持续学习——MySQL版本更新(8.0新特性)、新优化方法、新攻击方式,持续学习,不要用老方法处理新问题。掌握这些,数据库错误从『灾难』变『可处理的常规运维』,数据安全和数据库稳定有保障。

数据库Too many connections_连接数满排查与调优

标签:

更新时间:2026-08-27 11:32:21

上一篇:数据库Unknown column_字段不存在与添加方法

下一篇:注销备案_资料不合格修改重提