V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
fourstring
V2EX  ›  MySQL

种种迹象显示 MySQL 已经启动,但是各种需要数据库的程序都无法连接?

  •  2
     
  •   fourstring · 2016-08-07 20:06:27 +08:00 · 6790 次点击
    这是一个创建于 3030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题。 首先是基本系统情况:

    • OS:Ubuntu 14.04 x64 LTS
    • 数据库: Percona Server 5.7
    • PHP : PHP 7.0.9
    • 应用: WordPress 、 phpMyAdmin

    我做的一些排查工作:

    ➜  blog service mysql status
     * Percona Server 5.7.13-6 is running
    ➜  blog netstat -ap | grep mysql
    tcp        0      0 localhost:mysql         *:*                     LISTEN      20978/mysqld
    ➜  blog mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    

    Percona日志显示:

    2016-08-07T11:49:26.189089Z 0 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.7.13-6'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  Percona Server (GPL), Release '6', Revision 'e3d58bb'
    

    但是无论 WordPress 还是 phpmyadmin ,均不能连接 percona 。数据库主机尝试过设置 localhost 和 127.0.0.1 ,均无果。

    下面是 percona 配置文件,完全官方,没有任何更改(/etc/mysql/my.cnf ):

    #
    # The MySQL database server configuration file.
    #
    # You can copy this to one of:
    # - "/etc/mysql/my.cnf" to set global options,
    # - "~/.my.cnf" to set user-specific options.
    #
    # One can use all long options that the program supports.
    # Run program with --help to get a list of available options and with
    # --print-defaults to see which it would actually understand and use.
    #
    # For explanations see
    # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
    
    # This will be passed to all mysql clients
    # It has been reported that passwords should be enclosed with ticks/quotes
    # escpecially if they contain "#" chars...
    # Remember to edit /etc/mysql/debian.cnf when changing the socket location.
    [client]
    port		= 3306
    socket		= /var/run/mysqld/mysqld.sock
    
    # Here is entries for some specific programs
    # The following values assume you have at least 32M ram
    
    # This was formally known as [safe_mysqld]. Both versions are currently parsed.
    [mysqld_safe]
    socket		= /var/run/mysqld/mysqld.sock
    nice		= 0
    
    [mysqld]
    #
    # * Basic Settings
    #
    user		= mysql
    pid-file	= /var/run/mysqld/mysqld.pid
    socket		= /var/run/mysqld/mysqld.sock
    port		= 3306
    basedir		= /usr
    datadir		= /var/lib/mysql
    tmpdir		= /tmp
    lc-messages-dir	= /usr/share/mysql
    skip-external-locking
    #
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    bind-address		= 127.0.0.1
    #
    # * Fine Tuning
    #
    #key_buffer		= 16M
    max_allowed_packet	= 16M
    thread_stack		= 192K
    thread_cache_size       = 8
    # This replaces the startup script and checks MyISAM tables if needed
    # the first time they are touched
    #myisam-recover         = BACKUP
    #max_connections        = 100
    #table_cache            = 64
    #thread_concurrency     = 10
    #
    # * Query Cache Configuration
    #
    query_cache_limit	= 1M
    query_cache_size        = 16M
    #
    # * Logging and Replication
    #
    # Both location gets rotated by the cronjob.
    # Be aware that this log type is a performance killer.
    # As of 5.1 you can enable the log at runtime!
    #general_log_file        = /var/log/mysql/mysql.log
    #general_log             = 1
    #
    # Error log - should be very few entries.
    #
    log_error = /var/log/mysql/error.log
    #
    # Here you can see queries with especially long duration
    #log_slow_queries	= /var/log/mysql/mysql-slow.log
    #long_query_time = 2
    #log-queries-not-using-indexes
    #
    # The following can be used as easy to replay backup logs or for replication.
    # note: if you are setting up a replication slave, see README.Debian about
    #       other settings you may need to change.
    #server-id		= 1
    #log_bin			= /var/log/mysql/mysql-bin.log
    expire_logs_days	= 10
    max_binlog_size         = 100M
    #binlog_do_db		= include_database_name
    #binlog_ignore_db	= include_database_name
    #
    # * InnoDB
    #
    # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
    # Read the manual for more InnoDB related options. There are many!
    #
    # * Security Features
    #
    # Read the manual, too, if you want chroot!
    # chroot = /var/lib/mysql/
    #
    # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
    #
    # ssl-ca=/etc/mysql/cacert.pem
    # ssl-cert=/etc/mysql/server-cert.pem
    # ssl-key=/etc/mysql/server-key.pem
    
    
    
    [mysqldump]
    quick
    quote-names
    max_allowed_packet	= 16M
    
    [mysql]
    #no-auto-rehash	# faster start of mysql but no tab completition
    
    [isamchk]
    #key_buffer		= 16M
    
    #
    # * IMPORTANT: Additional settings that can override those from this file!
    #   The files must end with '.cnf', otherwise they'll be ignored.
    #
    !includedir /etc/mysql/conf.d/
    

    另外, PHP 和 MySQL 以及 nginx 的错误日志都有排查过,没有发现任何报错……

    求教各位大神,感谢!

    第 1 条附言  ·  2016-08-07 22:09:22 +08:00

    感谢各位大神的回复。

    综合了一下,看来是MySQL拒绝了PHP的连接,拒绝原因是root用户作用域只授权给localhost,而mysql根据连接地址127.0.0.1(本地连接)反向解析出的竟然是我的主机名(fourstring),然后与root用户localhost的作用域不符,因此拒绝连接。

    解决办法是@kn007提出的:

    USE mysql;CREATE USER 'root'@'%' IDENTIFIED BY '密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';FLUSH PRIVILEGES;
    

    即新建一个作用域为'%'的root用户并授予所有权限即可解决。

    非常感谢!

    第 2 条附言  ·  2016-08-08 13:55:53 +08:00
    貌似是 tincd 的锅。。。
    43 条回复    2016-08-08 22:23:45 +08:00
    UnisandK
        1
    UnisandK  
       2016-08-07 20:13:04 +08:00
    telnet 127.0.0.1 3306 看看
    fourstring
        2
    fourstring  
    OP
       2016-08-07 20:19:42 +08:00
    @UnisandK
    ➜ log telnet 127.0.0.1 3306
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    CHost 'fourstring' is not allowed to connect to this MySQL serverConnection closed by foreign host.

    这种情况是正常的吗?
    extreme
        3
    extreme  
       2016-08-07 20:31:59 +08:00
    @UnisandK Bash 的话这种才方便: > /dev/tcp/127.0.0.1/3306
    UnisandK
        4
    UnisandK  
       2016-08-07 20:32:08 +08:00
    @fourstring 不正常。。本地来的连接都 is not allowed 你说其他应用连得上个鬼。。
    fourstring
        5
    fourstring  
    OP
       2016-08-07 20:36:51 +08:00
    @UnisandK what?
    是权限没设置好的问题吗?
    请问怎么修改设置呢?谢谢
    fourstring
        6
    fourstring  
    OP
       2016-08-07 20:37:59 +08:00
    @UnisandK 如果本地连接都被 ban 了的话,为什么用 mysql -u root -p 仍然能连接上呢?
    extreme
        7
    extreme  
       2016-08-07 20:45:44 +08:00
    @fourstring 依我看,最好试试自己写 PHP 代码连,看看属性 connect_error 的值……
    fourstring
        8
    fourstring  
    OP
       2016-08-07 20:53:14 +08:00
    @extreme
    ➜ ~ php test.php
    PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1130] Host 'fourstring' is not allowed to connect to this MySQL server in /root/test.php:2
    我的 VPS 主机名就是'fourstring',这难道意味着不允许这个主机名连接?
    kn007
        9
    kn007  
       2016-08-07 21:02:56 +08:00
    cat /etc/resolv.conf 来看看。
    你不是用 localhost 和 127.0.0.1 来链接吗?
    怎么还会有 hostname ?
    解决这个问题,就是登录 mysql ,把对应的用户的域改为*而非本地主机。
    kn007
        10
    kn007  
       2016-08-07 21:05:06 +08:00
    你确定你是全新数据库?不要把其他地方的库,硬生生导入 mysql 。

    直接 mysql -uroot -p 密码 -h 127.0.0.1 登录试试。
    不行就--skip-grant-tables ,然后 use mysql;查看下用户什么情况
    kn007
        11
    kn007  
       2016-08-07 21:06:34 +08:00
    对了,第一条回复,应该是把作用域改成%,不是*。
    fourstring
        12
    fourstring  
    OP
       2016-08-07 21:08:14 +08:00
    @kn007 这个。。。我之前是把 mariadb 的库导入 percona ,都是 MySQL 的一个分支,应该问题不大?
    而且关键以前是可以正常运行的,今天突然挂掉了。。。
    kn007
        13
    kn007  
       2016-08-07 21:08:24 +08:00
    刚看到评论,说你 mysql 可以登上去。
    现在你有两个解决方案:
    第一个,最节省时间成本,把作用域改成%。
    第二个,检查 /etc/hosts ,看下为何 mysql 会认为你不是以本地登入
    fourstring
        14
    fourstring  
    OP
       2016-08-07 21:09:21 +08:00
    @kn007 cat 的真的是 resolv.conf ?不是 hosts ?
    resolv.conf :
    # Generated by SolusVM
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    hosts :
    # Generated by SolusVM
    127.0.0.1 localhost localhost.localdomain
    ::1 localhost localhost.localdomain
    xx.xx.xx.xx(本机 IP) fourstring
    fourstring
        15
    fourstring  
    OP
       2016-08-07 21:09:41 +08:00
    @kn007 好的,我看看,感谢!
    kn007
        16
    kn007  
       2016-08-07 21:09:56 +08:00
    @fourstring 一般来说,不能互导入,监测下 mysql-error.log 看看。 mysql5.5 导入到 5.7 都会出错。
    导入的话,建议备份非内置表,然后全新创建后,导入。
    kn007
        17
    kn007  
       2016-08-07 21:11:48 +08:00
    @fourstring hosts ,我的错。。。

    看起来没什么问题
    fourstring
        18
    fourstring  
    OP
       2016-08-07 21:12:13 +08:00
    @kn007 我的做法就是新建一个数据库'wordpress',然后导出老服务器上的数据库再导入新数据库
    kn007
        19
    kn007  
       2016-08-07 21:12:58 +08:00
    @fourstring 那这样导入是不存在的问题。
    kn007
        20
    kn007  
       2016-08-07 21:16:25 +08:00
    @fourstring 重启 mysql 或 FLUSH PRIVILEGES;试过么?
    kn007
        21
    kn007  
       2016-08-07 21:16:52 +08:00
    重启 mysql ,看下 mysql-error.log 有没有报错。
    fourstring
        22
    fourstring  
    OP
       2016-08-07 21:21:08 +08:00
    @kn007 您说的 mysql-error.log 就是配置文件里配置的 /var/log/mysql/error.log 吗?
    是的话好像并没有报错。。。全都是[Note]信息。
    另外求教一下更改用户权限的 SQL 怎么写呢?(我以前都是用 phpmyadmin= =
    kn007
        23
    kn007  
       2016-08-07 21:26:44 +08:00
    @fourstring

    USE mysql;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';FLUSH PRIVILEGES;
    fourstring
        24
    fourstring  
    OP
       2016-08-07 21:29:33 +08:00
    @kn007
    mysql> USE mysql;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';FLUSH PRIVILEGES;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    ERROR 1133 (42000): Can't find any matching row in the user table
    Query OK, 0 rows affected (0.00 sec)

    这是什么原因呢? user 表中没有符合条件的数据?
    kn007
        25
    kn007  
       2016-08-07 21:30:54 +08:00
    @fourstring 你确定你重启过 mysql ?
    先 FLUSH PRIVILEGES;
    然后重新执行一遍。
    fourstring
        26
    fourstring  
    OP
       2016-08-07 21:32:50 +08:00
    @kn007 是的。。。重启并且执行了这个刷新权限的语句。。。然而 依然无解
    kn007
        27
    kn007  
       2016-08-07 21:35:34 +08:00
    @fourstring show me:
    use mysql; select host,user from user ;
    fourstring
        28
    fourstring  
    OP
       2016-08-07 21:36:59 +08:00
    @kn007
    mysql> use mysql; select host,user from user ;
    Database changed
    +-----------+-----------+
    | host | user |
    +-----------+-----------+
    | localhost | mysql.sys |
    | localhost | root |
    +-----------+-----------+
    2 rows in set (0.00 sec)
    kn007
        29
    kn007  
       2016-08-07 21:38:40 +08:00
    @fourstring 哦,忘记了,你不存在用户。

    下面命令改下密码
    USE mysql;CREATE USER 'root'@'%' IDENTIFIED BY '密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';FLUSH PRIVILEGES;
    billlee
        30
    billlee  
       2016-08-07 21:50:28 +08:00
    你是不是把 hosts 里面的 127.0.0.1 localhost 去掉了?
    extreme
        31
    extreme  
       2016-08-07 22:00:07 +08:00
    @fourstring 刚刚干其他事情去了
    @kn007 真热情呢。
    你连接数据库用的应该是 localhost ?配置文件有 bind-address 127.0.0.1 ,对 MySQL 来说来源 IP 应该是 127.0.0.1 了,那么 MySQL 会反解出 127.0.0.1 的 hostname ,不过解析出了你的 hostname fourstring 的确有点怪,按道理应该根据 /etc/hosts 的 127.0.0.1 的记录来解析的。
    这问题值得研究……
    fourstring
        32
    fourstring  
    OP
       2016-08-07 22:04:14 +08:00
    @extreme 对啊,我自己都觉得很奇怪。。。
    另外有人跟我说他的 percona 也出过一次各种地方毫无错误但是就是连不上启动不了的错误……
    fourstring
        33
    fourstring  
    OP
       2016-08-07 22:06:31 +08:00
    @kn007 好了,非常感谢!
    kn007
        34
    kn007  
       2016-08-07 22:07:54 +08:00
    @fourstring 好的,这也是临时应急之案。有机会还是要找出问题来。
    @extreme 哈,今晚急需麻醉自己。
    kn007
        35
    kn007  
       2016-08-07 22:13:23 +08:00
    @extreme
    我想到了个原因。
    @fourstring 你把 ifconfig 打印出来看看。。。

    会不会是 lo 网卡丢失。。。没 127.0.0.1 了。。。
    kn007
        36
    kn007  
       2016-08-07 22:15:55 +08:00
    还有一个可能就是 iptables 把 lo 流量禁止了,或把 3306 端口流量给 eth0 了。。。
    kn007
        37
    kn007  
       2016-08-07 22:19:26 +08:00
    我记得 ubuntu 和 debian 有个坑就是 lo 木有,要手动开。。。
    还是 centos 好。。。
    fourstring
        38
    fourstring  
    OP
       2016-08-07 22:49:17 +08:00
    @kn007 lo 是有的,这个我确认
    fourstring
        39
    fourstring  
    OP
       2016-08-07 22:52:01 +08:00
    @kn007 可能原因是我开了 tincd ,怪不得最近这几天才挂……
    julyclyde
        40
    julyclyde  
       2016-08-08 17:55:52 +08:00
    mysql 语境下, localhost 是一个神奇的词,意思是通过 unix domain socket 连接,而不经过网络
    davehandong
        41
    davehandong  
       2016-08-08 18:13:23 +08:00
    配置文件 /etc/mysql/my.cnf 里的 bind-address 值,改成 0.0.0.0 就好了
    fourstring
        42
    fourstring  
    OP
       2016-08-08 20:28:52 +08:00
    @julyclyde 对,这个我知道。然而我在 php.ini 里配置了 default-socket 也无果
    julyclyde
        43
    julyclyde  
       2016-08-08 22:23:45 +08:00
    @fourstring 你得确认你改的那个 php.ini 是你运行的那套 PHP 承认的那个 ini 。先看看 phpinfo 输出结果对不对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.