信科网络 · 11 年只做 WordPress | 建站 / 主题 / 插件 / 商城 / 迁移 / 托管 | 累计服务 3000+ 企业 | 源码全交付
服务热线:13280692153 邮箱:web@wordpressx.com
工作日 08:30-18:0013280692153 免费诊断
首页/WordPress 教程/WordPress 数据库连接错误:从报错原文到修复
BLOG

WordPress 数据库连接错误:从报错原文到修复

分类 发布 2026-10-25

打开站点只看到一行 Error establishing a database connection,中文语言包会显示「建立连接数据库时出错」。这条信息故意不透露细节,因为 WordPress 不想把数据库地址和账号错误暴露给访客。但对站长来说,它把所有可能性压缩成了一句,所以必须自己一层层往下挖。

三种原文,指向的不是一件事

同样看起来是「连不上」,报错出现在不同阶段,原因完全不同。先在浏览器里确认看到的是哪一句,别凭印象判断。

报错原文 失败在哪一步 大概率原因
Error establishing a database connection 握手阶段,连接就没建立 库地址错、账号密码错、MySQL 没启动、端口不通
Error selecting database 连上了,选库失败 DB_NAME 写错,或该用户对库没有权限
建立连接数据库时出错 同第一行(中文语言包) 同上
Table ‘./db/wp_options’ is marked as crashed and should be repaired 连上了,读表失败 表损坏,需要 REPAIR TABLE
MySQL server has gone away 连接中途断开 包太大、超时、MySQL 被 OOM 杀掉

区分第一种和第二种很关键:第一种说明问题在网络或凭据,第二种说明凭据是对的但库名或权限不对,两者的排查路径完全相反。

逐项核对四个常量

WordPress 的数据库信息全在 wp-config.php 里。这个文件如果被改过(换服务器、改密码、装迁移插件),四个常量任何一个写错都会导致同一个报错。

define( 'DB_NAME',     'wp_db' );
define( 'DB_USER',     'wpuser' );
define( 'DB_PASSWORD', 'p@ss&word#2026' );
define( 'DB_HOST',     'localhost' );
define( 'DB_CHARSET',  'utf8mb4' );
define( 'DB_COLLATE',  '' );

几个真实踩过的坑。密码里有单引号时没有转义,PHP 直接语法错误,页面可能白屏而不是报数据库错;密码首尾被复制进了空格,肉眼看不出来,连不上;DB_HOST 写成 localhost:3306,WordPress 会把它当主机名传给 mysqli,解析失败;库名在 phpMyAdmin 里看到的是 wp_db,但主机面板给用户授权的其实是 wp_db_prod,这种在共享主机上很常见。

核对方式不要靠眼睛。登录 phpMyAdmin 或命令行,用同一组账号手工连一次:mysql -h 主机 -u 用户 -p 库名。能进去,说明凭据和权限没问题,问题在 PHP 侧或网络侧;进不去,报错会直接告诉你 Access denied 还是 Unknown database。

用最小脚本拿到真实报错

WordPress 把错误吞掉了,但 PHP 本身不会。在站点根目录临时放一个测试文件,绕开 WordPress 直接连库,就能看到 mysqli 的原始错误。测完立刻删掉。

<?php
$m = new mysqli( 'localhost', 'wpuser', 'password', 'wp_db' );
if ( $m->connect_error ) {
    die( 'connect: ' . $m->connect_error );
}
echo 'connected, server version: ' . $m->server_info;
$m->close();

常见的三种返回对应三个方向:Access denied for user 是账号密码或授权主机不对;Unknown database 是库名错或库不存在;Can't connect to local MySQL server through socket 是 socket 路径问题或服务没起;Connection refused 是 TCP 端口不通。这一步能省掉后面 80% 的猜测。

localhost 和 127.0.0.1 不是一回事

这是最容易忽略的一条。两个写法看起来等价,走的路径完全不同。

写法 实际走什么 什么时候出问题
localhost Unix socket 文件 PHP 编译时的 socket 路径和 MySQL 实际路径不一致
127.0.0.1 TCP 回环,端口 3306 MySQL 只监听 socket、没监听 TCP,或防火墙拦了回环
内网 IP / 主机名 TCP,走网卡 数据库在另一台机器,安全组没放行

典型场景:迁移到新服务器后,PHP 的 mysqli.default_socket 指向 /tmp/mysql.sock,而 MySQL 实际把 socket 放在 /var/run/mysqld/mysqld.sock,用 localhost 就连不上,报 No such file or directory。把 DB_HOST 改成 127.0.0.1 立刻正常,因为绕开了 socket。

反过来也有坑:某些环境为了性能禁用了 TCP 监听(skip-networking),这时改 127.0.0.1 会变成 Connection refused,必须用 socket。判断方法很简单,ss -lntp | grep 3306 有输出就是监听了 TCP,没有就只能走 socket。用 SHOW VARIABLES LIKE 'socket'; 能看到真实路径。

确认数据库服务本身活着

前两步都通过、报错依旧是连接失败时,问题在服务端。按顺序看三样东西:

  1. 服务状态:systemctl status mysqld(Debian/Ubuntu 上是 mysql)。状态是 failed 就去看日志,不要急着重启,重启前先确认能不能救出数据。
  2. 端口监听:ss -lntp | grep 3306,没有输出说明服务起来了但没监听,通常是配置被改坏。
  3. 磁盘空间:df -h。磁盘写满时 MySQL 会直接退出或者拒绝写入,日志里是 No space left on device。这是最容易被忽略的原因,尤其是 binlog 没清理的服务器,/var/lib/mysql 能悄悄涨到几十 G。

日志位置:CentOS 系在 /var/log/mysqld.log,Debian 系在 /var/log/mysql/error.log,宝塔面板在 /www/server/data/*.err。看最后 50 行基本就能定位。如果服务起不来又急,先把数据目录整个复制一份再动手,别在唯一的副本上做修复操作。

表损坏:REPAIR TABLE 的适用范围

站点能连上库,但某些页面 500,或者后台提示 wp_options 崩溃,属于另一类问题。先检查再修复,不要上来就 REPAIR。

CHECK TABLE wp_posts, wp_options, wp_postmeta, wp_term_relationships;
REPAIR TABLE wp_posts;

要注意 REPAIR TABLE 只对 MyISAM 表有效。现代 WordPress 默认用 InnoDB,对 InnoDB 跑 REPAIR 通常返回「doesn’t support repair」,这不是失败,而是根本用不上。InnoDB 表损坏的正确处理是先备份,再在 my.cnf 里设 innodb_force_recovery = 1(必要时逐级加到 4),把数据导出来,然后重建表再导回。整个过程前提是有备份,所以 备份恢复 的演练不能省。

wp_options 膨胀:连接慢和超时的常见来源

有一类「时好时坏」的连接错误,其实是查询太慢导致超时。wp_options 表在每次请求时都会被完整加载 autoload 的部分,这张表一旦膨胀到几十 MB,每个页面都要多花几百毫秒,并发一高就报 MySQL server has gone away。

先看谁在占空间:

SELECT option_name, LENGTH(option_value) AS len
FROM wp_options
WHERE autoload = 'yes'
ORDER BY len DESC
LIMIT 20;

SELECT SUM(LENGTH(option_value)) / 1024 / 1024 AS autoload_mb
FROM wp_options
WHERE autoload = 'yes';

autoload 总量超过 1MB 就该处理,超过 5MB 会明显拖慢。常见来源是过期 transient、卸载插件留下的设置项、以及主题存进去的大量演示数据。清理时按类型分开处理:

-- 过期临时缓存,删了会自动重建
DELETE FROM wp_options WHERE option_name LIKE '_transient_%';
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%';

-- 查询后再决定,别直接跑
SELECT option_name FROM wp_options
WHERE option_name LIKE '%旧插件前缀%';

第一条可以放心执行,transient 本来就是缓存;第二条必须先看清楚再删,很多设置项名字看不出属于谁,删错会导致主题配置丢失。如果装了 Redis 之类的对象缓存,transient 会被接管,这时清表意义不大,反而要清缓存。wp_postmeta 里的孤儿数据(post_id 对应的文章已经不存在)也是同样的道理,能清出可观的体积,方法在 数据库优化 里。

可执行的定位顺序

  1. 确认报错原文属于哪一类,是连接失败、选库失败还是表损坏。
  2. 用最小 PHP 脚本直连,拿到 mysqli 的原始错误,别再猜。
  3. 核对 wp-config.php 四个常量,注意空格、引号、库名前缀。
  4. 在命令行用同组账号连一次,区分「凭据问题」和「网络问题」。
  5. 切换 localhost 与 127.0.0.1,看是否 socket 路径问题。
  6. 查服务状态、端口监听、磁盘空间、错误日志最后 50 行。
  7. 连得上但页面报错,走 CHECK/REPAIR 或 InnoDB 恢复流程。
  8. 都排除了,再从最近的备份恢复——先恢复数据库,再考虑文件。

顺序不要跳。跳过第 2 步直接去改配置,很容易把一个原本只是 socket 路径的小问题,改成账号密码也错、库名也错的复合问题。同样的道理,如果整站打不开但不只报数据库错误,先按 打不开排查 的流程确认是 PHP 层还是数据库层,再回来处理这一篇的内容,分类更细的报错可以看 数据库报错。

数据库连接错误里真正危险的不是连不上,而是在没有备份的情况下连不上。修复之前先把 /var/lib/mysql 整个目录复制一份,这一步花不了几分钟,但能把「修坏了」变成「重来一次」。信科网络处理这类故障时也是先保数据再谈恢复,需要人上手可以打 13280692153。

INDUSTRIAL BELT

扎根中国制造产业带
懂工厂,才懂出海

从胶东半岛到珠三角,从长三角到中原腹地,每一片产业集群都有自己的出口节奏与买家画像。信科网络长期扎根产业一线,把工厂的产品语言翻译成海外采购商听得懂的搜索语言,让每一分投入都对着真实的询盘去。

litong

利通外贸网站建设

利通区隶属于宁夏自治区吴忠市,地处中国西北内陆,位于宁夏平原中部,距首府银川市59千米,是宁夏经济发展的核心区之一,也是吴忠市政治、经济、文化中心。辖区总面积1384平方千米,辖8镇4乡…

nanchuan

南川外贸网站建设

南川地处四川盆地东南边缘与云贵高原过渡地带,位于重庆市南部,东南与贵州省道真、正安、桐梓县接壤,东北与武隆县为邻,北接涪陵区,西连巴南区、綦江县、万盛区。总面积2602平方千米。总人…

tongliang

铜梁外贸建站

重庆市铜梁县位于四川盆地东南部、重庆西北部,唐长安四年(公元704年)建县,因境内“小铜梁山”而得名,是国际主义战士邱少云的故乡和蜚声中外的铜梁龙的发祥地。全县幅员面积1334平方公里,辖…

liangping

梁平外贸建站

梁平县,原名梁山县,位于重庆市东北部,东邻万州区,西连四川省大竹县,南靠忠县、垫江县,北接四川省达州市达县、开江县。”。  

cangxian

沧县WordPress建站

沧县位于河北省东南部,冀中平原东部,北冀京津,东邻渤海,地理坐标在北纬38°5′至38°3′,东经116°27′至117°9′之间。县政府驻沧州市新华区,全县总面积1527平方公里,其中耕地面积129万亩,总…

wushan

巫山WordPress建站

巫山位于重庆市东北部,三峡库区腹心,素有“渝东门户”之称,地跨长江巫峡两岸。东邻湖北省巴东县,西接奉节县,南与湖北省建始县毗连,北与巫溪县及神农架林区接壤。县城位于大宁河与长江交汇…

taole

陶乐Shopify建站

陶乐镇是中华人民共和国宁夏回族自治区石嘴山市平罗县下辖的一个乡镇级行政单位。陶乐镇位于宁夏回族自治区石嘴山市。陶乐镇生态新农居是石嘴山市政府重点扶持的“社会主义新农村建设”项目。陶…

beibei

北碚Shopify建站

北碚区位于重庆市区西北郊的缙云山下,嘉陵江畔,幅员面积753平方公里,人口63万,是重庆的风景旅游区和智力型清洁工业基地。本世纪20年代末,由爱国实业家卢作孚先生开拓,抗战时期为陪都重庆…

xixia

西夏外贸推广

西夏区是宁夏回族自治区银川市的一个市辖区,位于银川市西部,地理坐标东经105°49′~106°18′,北纬38°08′~38°52′。西夏区东起包兰铁路,西至贺兰山口轴线(宁蒙界),南临永宁县,北接贺兰县,…

anxin

安新外贸推广

安新县位于河北省中部,县境东与雄县、任丘相连;南与高阳接壤;西与清苑、徐水交界;北与容城毗邻。总面积738.6平方公里。县人民政府所在地安新镇是安新县政治、经济、文化和交通中心,北距…

youyang

酉阳Google SEO

酉阳土家族苗族自治县地处渝东南边陲的武陵山区,渝、鄂、湘、黔四省(市)在此接壤,是渝东南重要门户。全县面积5173平方公里,是重庆市面积最大的县,辖39个乡镇,人口73万,其中土家族44.5…

fengjie

奉节GEO优化

奉节县位于重庆市东部,地处四川盆地东端,地理坐标为东经109°1′17″—109°45′58″,北纬30°29′19″—31°22′33″。县境东邻巫山县,南界湖北省恩施土家族苗族自治州,西连云阳县,北接巫溪县。境内有…

qianjiang

黔江GEO优化

重庆市黔江区位于重庆市的东南边缘,地处武陵山腹地,东临湖北省的咸丰县,西界彭水县,南连酉阳县,北接湖北利川市,是渝、鄂、湘、黔四省市的结合部,素有”渝鄂咽喉”之称。另外…

huanghua

黄骅谷歌SEM

概况:黄骅市位于北纬38°09′-38°39’,东经117°05′-117°49’之间。处于“环渤海、环京津”的“双环”枢纽地带和东北来经济圈的中心位置,是国家跨世纪工程–神华工程的…

pengyang

彭阳谷歌SEM

彭阳县位于宁夏回族自治区,位于宁夏回族自治区南部边缘,六盘山东麓,介于东经106°32′-106°58’之间,北纬35°4l’-36°17’。西连宁夏固原市原州区,东、南、北环临甘肃…

xiongxian

雄县Facebook广告

河北省保定市雄县位于东经116°06',北纬38°59'。平均海拔10米。处于冀中平原的京、津、保三角腹地,南倚“华北明珠”白洋淀,北靠“京南小香港”___白…

jiangjin

江津Facebook广告

重庆市江津区,是一个历史文化悠久的城市,以地处长江要津而得名。江津位于重庆西南长江之滨,距渝中区公路里程50公里;铁路里程65公里;水路里程72公里。江津城区气候特征与重庆相近,但综合…

haiyuan

海原Yandex推广

位于中国宁夏回族自治区中南部。1991年底人口31.15万。回族为主,有汉、满、蒙古、东乡等民族。西汉属安定郡。清同治十三年(1874)设海城县。民国三年(1914)改海原县。地形复杂,多山地。年…

yanchi

盐池Yandex推广

山西省运城市即古河东盐池,亦称解池。地处运城盆地之南,中条山北麓,自东北向西南延伸,长约30公里,宽3——5公里,面积130平方公里,是由鸭子池、盐池、硝池等几个部分组成,湖面海拔324.5米…

rongcheng

容城TikTok推广

河北省容城县,历史悠久,距今已有2000年的历史,全县总面积314平方公里,总人口25万人。地理位置得天独厚。位于河北省中部,京、津、保腹地,距首都北京和天津直辖市均为120公里,两个小时的…

为什么一定要选懂产业带的出海服务商?建材丝网的欧洲建筑商看资质与交期,工业橡塑的中东工程商问耐温与工况,毛皮服饰的俄罗斯分销商算的是季节与毛利。买家不同,决策逻辑就不同;信科网络把这些差异拆进网站结构、关键词地图和投放策略里,用他们习惯的方式出现在他们搜索的地方。