MariaDB: ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")

当尝试连接到本地MariaDB服务器时遇到2003错误,'Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")'。这可能是由于服务器未运行或配置问题导致。检查端口状态显示端口关闭,进一步调查发现MariaDB异常退出,提示内存不足。解决方案是调整MariaDB配置,减小buffer pool大小,然后重启服务。

MariaDB : ERROR 2003 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (111 “Connection refused”)

注意:如果你是因为没有设置允许远程访问,请参考这篇文章:debian,ubuntu下安装MariaDB,并设置密码,修改端口,允许外网访问

早上想连接到数据库时报错如下(我把数据库的端口改成了51009,防止被人发现):

-> # mysql -h 127.0.0.1 -P 51009 -u root -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")

我用的是MariaDB,我的问题跟其他人的不同,我是前一天还是可以连接的,然后今天就连接不上了。

然后查看端口情况:

-> # nmap -p 51009 127.0.0.1

Starting Nmap 7.40 ( https://nmap.org ) at 2019-04-04 09:15 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000062s latency).
PORT      STATE  SERVICE
51009/tcp closed unknown

发现端口关闭了,我觉得事情不对,于是查看MariaDB 的状态:

-> # service mysql status
● mariadb.service - MariaDB 10.1.37 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2019-04-04 07:11:25 CST; 2h 15min ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 20933 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 20931 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
  Process: 6808 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
  Process: 6731 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSRE
  Process: 6725 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 6724 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
 Main PID: 6808 (code=exited, status=1/FAILURE)
   Status: "MariaDB server is down"
      CPU: 312ms

Apr 04 07:11:24 VM-73-203-debian systemd[1]: mariadb.service: Service hold-off time over, scheduling restart.
Apr 04 07:11:24 VM-73-203-debian systemd[1]: Stopped MariaDB 10.1.37 database server.
Apr 04 07:11:24 VM-73-203-debian systemd[1]: Starting MariaDB 10.1.37 database server...
Apr 04 07:11:24 VM-73-203-debian mysqld[6808]: 2019-04-04  7:11:24 139734049481152 [Note] /usr/sbin/mysqld (mysqld 10.1.37-MariaDB-0+deb9u1) starting as process 6808 ..
Apr 04 07:11:25 VM-73-203-debian systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
Apr 04 07:11:25 VM-73-203-debian systemd[1]: Failed to start MariaDB 10.1.37 database server.
Apr 04 07:11:25 VM-73-203-debian systemd[1]: mariadb.service: Unit entered failed state.
Apr 04 07:11:25 VM-73-203-debian systemd[1]: mariadb.service: Failed with result 'exit-code'.

发现MariaDB 发生异常,直接退出了。
查看更详细的报错信息:

-> # cat /var/log/mysql/error.log
2019-04-04  7:11:24 139734049481152 [ERROR] mysqld: Out of memory (Needed 128663552 bytes)
2019-04-04  7:11:24 139734049481152 [Note] InnoDB: innodb_empty_free_list_algorithm has been changed to legacy because of small buffer pool size. In order to use backoff, increase buffer pool at least up to 20MB.

2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: The InnoDB memory heap is disabled
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Compressed tables use zlib 1.2.8
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Using Linux native AIO
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Using SSE crc32 instructions
2019-04-04  7:11:25 139734049481152 [Note] InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(140574720 bytes) failed; errno 12
2019-04-04  7:11:25 139734049481152 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2019-04-04  7:11:25 139734049481152 [ERROR] Plugin 'InnoDB' init function returned error.
2019-04-04  7:11:25 139734049481152 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-04-04  7:11:25 139734049481152 [Note] Plugin 'FEEDBACK' is disabled.
2019-04-04  7:11:25 139734049481152 [ERROR] Unknown/unsupported storage engine: InnoDB
2019-04-04  7:11:25 139734049481152 [ERROR] Aborting

里面有关键的一句:

InnoDB: Cannot allocate memory for the buffer pool

这句话报错的意思是内存不够了,要么增加内存,要么减小buffer pool的大小。
我选择减小buffer pool 的大小,在[mysqld]下面增加一行:

nano /etc/mysql/mariadb.conf.d/50-server.cnf 
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
innodb_buffer_pool_size = 32M

重新启动MariaDB:

service mysql start 
<think>我们遇到的问题是在启动容器后,尝试连接MySQL时出现错误:ERROR2003(HY000):Can'tconnect toMySQL serveron '127.0.0.1'(111)这个错误通常表示客户端无法连接到MySQL服务器。可能的原因包括: 1. MySQL服务没有运行。 2.配置绑定了错误的IP地址(例如只绑定了localhost或127.0.0.1,但容器网络环境可能不同)。 3.防火墙或安全组阻止了连接。4.MySQL监听的端口(默认3306)没有正确暴露或映射。5.容器内的MySQL服务配置问题,比如bind-address设置不正确。 在容器环境中,我们通常使用Docker运行MySQL容器。因此,解决步骤可能包括: ###步骤1:检查MySQL容器是否正在运行使用命令 `docker ps`查看容器状态,确保MySQL容器处于运行状态(Up状态)。###步骤2:检查容器的端口映射使用`dockerps`查看端口映射,确保宿主机的端口正确映射到容器的3306端口。例如,应该有一行类似`0.0.0.0:3306->3306/tcp`的映射。 ###步骤3:进入容器内部检查MySQL服务状态进入容器内部,检查MySQL服务是否在容器内正常运行: ```bashdocker exec-it<container_name_or_id>bash```在容器内部,使用以下命令检查MySQL服务状态(根据镜像不同,可能是mysqlmariadb等): ```bashservice mysqlstatus#或者systemctlstatus mysql```但注意,很多MySQL镜像使用轻量级系统(如alpine)可能没有systemctl,可以直接使用进程查看:```bashpsaux |grep mysql```###步骤4:检查MySQL的bind-address配置在容器内部,查看MySQL配置文件(通常位于/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address设置。 在容器中,通常需要设置为`0.0.0.0`(表示监听所有网络接口)或者注释掉bind-address行,以允许外部连接。例如,在配置文件中找到: ```inibind-address =127.0.0.1```改为:```inibind-address=0.0.0.0``` 或者注释掉: ```ini# bind-address=127.0.0.1``` ###步骤5:重启MySQL服务修改配置后,重启容器内的MySQL服务(如果容器内支持服务管理):```bashservicemysql restart```或者直接重启容器:```bashdockerrestart <container_name_or_id>``` ###步骤6:检查容器网络如果容器在非默认网络中,确保连接时使用正确的IP地址(容器的IP地址,而不是127.0.0.1)。在容器内部,可以通过`hostname -I`查看容器IP,然后尝试使用该IP连接。###步骤7:检查防火墙如果是在宿主机上连接容器,确保宿主机的防火墙放行了映射的端口(如3306)。 ###示例:使用Docker运行MySQL的正确方式在运行MySQL容器时,通常我们会指定端口映射和环境变量(如root密码): ```bashdocker run--name some-mysql-eMYSQL_ROOT_PASSWORD=my-secret-pw-p3306:3306-dmysql:tag``` 其中`-p3306:3306`将宿主机的3306端口映射到容器的3306端口。 ###连接测试在宿主机上,尝试使用以下命令连接:```bashmysql-h127.0.0.1-P3306 -u root-p```如果是在容器内连接,可以使用容器名称(如果使用自定义网络)或者容器IP。###如果以上步骤都不行,考虑重新创建容器有时候配置问题可能比较复杂,重新创建一个容器可能是最快的解决方案。###代码示例:如何正确启动一个MySQL容器并连接以下是一个示例,展示如何启动MySQL容器,并修改配置允许远程连接(如果需要): ```bash#启动一个MySQL容器dockerrun --name my-mysql-eMYSQL_ROOT_PASSWORD=password-p3306:3306-dmysql:8.0#进入容器修改配置(如果需要) dockerexec -it my-mysqlbash#在容器内,安装编辑器(如vim)如果镜像没有的话(alpine使用apk,debian/ubuntu使用apt)apt-getupdate &&apt-getinstall vim -y#编辑配置文件,例如在Debian-based镜像中,配置文件可能在/etc/mysql/mysql.conf.d/mysqld.cnfvim/etc/mysql/mysql.conf.d/mysqld.cnf#修改bind-address为0.0.0.0#退出容器,重启容器docker restartmy-mysql``` ###注意:MySQL8.0的默认认证插件在MySQL8.0中,默认的认证插件是caching_sha2_password,而一些旧的客户端可能不支持。如果连接时出现认证问题,可能需要创建用户时指定使用mysql_native_password插件,或者更新客户端。###总结以上步骤应该能解决大部分容器内MySQL连接问题。如果问题依旧,请提供更多环境信息,如Docker命令、配置文件内容、错误日志等。 §§相关问题§§: 1.如何查看Docker容器的日志?2.在Docker容器中如何修改MySQL的root密码? 3.如何配置Docker容器使用自定义的MySQL配置文件? 4.如何解决MySQL8.0的认证插件导致连接失败的问题?</think>### 解决MySQL连接错误:ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111) 这个错误通常发生在容器环境中尝试连接MySQL服务时,表明客户端无法访问MySQL服务器。以下是常见原因及解决方案: #### 1. **MySQL服务未启动** ```bash # 进入容器检查MySQL状态 docker exec -it <container_name> bash # 检查MySQL服务状态 service mysql status # 或 systemctl status mysql ``` **解决方案**:启动MySQL服务 ```bash service mysql start ``` #### 2. **端口未暴露或映射错误** **检查容器端口映射**: ```bash docker ps --format "table {{.Names}}\t{{.Ports}}" ``` **正确启动容器**(添加`-p`参数): ```bash docker run -d --name mysql-container \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ mysql:8.0 ``` #### 3. **绑定地址限制** **修改MySQL配置文件**: ```bash docker exec -it mysql-container bash echo "bind-address = 0.0.0.0" >> /etc/mysql/my.cnf service mysql restart ``` #### 4. **防火墙限制** **开放端口**(宿主机操作): ```bash # Ubuntu/Debian sudo ufw allow 3306 # CentOS/RHEL sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload ``` #### 5. **容器网络问题** **使用容器网络**: ```bash # 创建共享网络 docker network create my-network # 将MySQL和客户端容器加入同一网络 docker run -d --net my-network --name mysql-server mysql docker run -it --net my-network mysql mysql -h mysql-server -u root -p ``` #### 6. **完整排查脚本** ```bash #!/bin/bash CONTAINER_NAME="mysql-container" # 检查容器状态 docker ps | grep $CONTAINER_NAME || echo "Container not running!" # 检查端口映射 docker port $CONTAINER_NAME 3306 || echo "Port not mapped!" # 检查MySQL进程 docker exec $CONTAINER_NAME ps aux | grep mysqld || echo "MySQL not running!" # 测试容器内连接 docker exec $CONTAINER_NAME mysql -u root -p'your_password' -e "SHOW DATABASES;" || echo "Internal connection failed!" # 测试外部连接 mysql -h 127.0.0.1 -P 3306 -u root -p'your_password' -e "SELECT 1;" || echo "External connection failed!" ``` ### 关键点说明: 1. **bind-address=0.0.0.0**:允许所有IP连接(生产环境需结合安全策略) 2. **端口映射**:`-p 宿主机端口:容器端口` 必须正确配置 3. **容器网络**:推荐使用自定义网络避免IP变化 4. **MySQL 8.0+**:新版本可能需要额外配置认证插件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值