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
SP00F
V2EX  ›  MySQL

很好奇, MySQL 可以加载多个 my.cnf 配置文件吗?

  •  
  •   SP00F · 2017-01-15 19:48:22 +08:00 · 5506 次点击
    这是一个创建于 2672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这边因为项目上线,在 MySQL 5.5 以及 5.7 中测试过去了,但是线上 MySQL 版本为 5.6 执行失败

    Incorrect integer value: '' for column 'id' at row 1 [closed]
    

    原因是 sql_mode 设置了,但在 my.cnf 中配置时取消 sql_mode 发现仍未解决该问题。无奈只能临时 SET global sql_mode = '' 解决问题,随后用最笨的检查方式检索整个硬盘上的 my.cnf 文件,发现其中一个配置文件内容为

    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
    
    [mysqld]
    
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    
    # These are commonly set, remove the # and set as required.
    # basedir = .....
    # datadir = .....
    # port = .....
    # server_id = .....
    # socket = .....
    
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    

    sql_mode 行注释后解决该问题。

    my.cnf位于 /usr/local/mysql/my.cnf 而实际使用的是 /etc/my.cnf

    新手请教 MySQL 是可以加载多个 my.cnf 配置文件的吗?如何检查 MySQL 的配置文件加载都有哪些?以及加载顺序呢?

    16 条回复    2017-01-16 08:55:56 +08:00
    BombayCat
        1
    BombayCat  
       2017-01-15 19:56:57 +08:00 via Android
    是有多个 my.cnf 的,不同位置的对应的作用域不一样
    SP00F
        2
    SP00F  
    OP
       2017-01-15 20:01:07 +08:00
    @BombayCat
    但是很好奇,按加载顺序是

    ````# mysql --help|grep 'my.cnf'
    order of preference, my.cnf, $MYSQL_TCP_PORT,
    /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf````

    发现并没有 `/usr/local/mysql/my.cnf` 作为检查顺序,就有加载这个 my.cnf 所以很好奇,按顺序查找 my.cnf 的话,不存在会加载 `/usr/local/mysql/my.cnf` 该配置文件吧。
    skydiver
        3
    skydiver  
       2017-01-15 20:03:39 +08:00 via Android
    既然是 /usr/local 说明是自己编译的,所以你需要 /usr/local/bin/mysql --help
    SP00F
        4
    SP00F  
    OP
       2017-01-15 20:12:58 +08:00
    @skydiver
    是的,查找顺序是 /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

    但,并没有 /usr/local/mysql/my.cnf 所以我很懵逼。。。怎么会加载了一下这个 my.cnf
    wql
        5
    wql  
       2017-01-15 20:13:50 +08:00 via Android
    @SP00F include 指令?
    SP00F
        6
    SP00F  
    OP
       2017-01-15 20:17:13 +08:00
    @wql
    没有看到 include …… 不清楚是否在编译的时候加的。。。

    MySQL 启动时未指定 my.cnf 位置,是按照 MySQL 的查找顺序找到 my.cnf 运行的。
    skydiver
        7
    skydiver  
       2017-01-15 20:22:01 +08:00
    @SP00F /usr/local/bin/mysql --help 也是一样的输出?
    SP00F
        8
    SP00F  
    OP
       2017-01-15 20:26:54 +08:00
    @skydiver
    我的是 /usr/bin/mysql

    [root@localhost bin]# /usr/bin/mysql --help | grep 'cnf'
    order of preference, my.cnf, $MYSQL_TCP_PORT,
    /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

    所以很奇怪拉。
    skydiver
        9
    skydiver  
       2017-01-15 20:37:25 +08:00
    @SP00F 并没有 /usr/local/bin/mysql ?那 /usr/local 里的配置文件哪来的?
    skydiver
        10
    skydiver  
       2017-01-15 20:40:05 +08:00
    @SP00F 你看的 /usr/bin/mysql 当然不会读取 /usr/local/ 里的配置文件了……

    你最好确定下你启动的 mysql 到底是哪个。如果你改了 /usr/local 的配置文件就好了,说明你启动的不是 /usr 里的那一份而是 /usr/local 里的那一份 mysql
    SP00F
        11
    SP00F  
    OP
       2017-01-15 20:45:33 +08:00
    @skydiver
    /usr/bin/mysql 是软链接,真实的是 /usr/local/mysql/bin/mysql

    现在怀疑的是 /etc/init.d/mysql 中的问题。会查找 --basedir 下的 my.cnf 也就是 /usr/local/mysql/my.cnf

    不过我好奇的是可以多个 my.cnf 加载的吗?
    skydiver
        12
    skydiver  
       2017-01-15 20:53:31 +08:00
    @SP00F 你可以直接 /usr/local/mysql/bin/mysql --help 看看,也许加载路径和输入的路径有关系

    加载多个 my.cnf 是可以的,你没看到你上面的输出就有 3 个吗 /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf 按顺序加载的
    SP00F
        13
    SP00F  
    OP
       2017-01-15 21:06:23 +08:00
    @skydiver
    嗯,我检查过输出的几个配置文件,只有 /etc/my.cnf 存在,然后另外一个就是 /usr/local/mysql/my.cnf 了。

    按照一般启动方式,没有指定配置文件的话,是按照 /etc/mysql/my.cnf /etc/my.cnf 以及 ~/.mysql.cnf 加载的,启动的用户 mysql 的主目录也在 /home/mysql 所以没道理会加载 /usr/local/mysql/my.cnf 配置文件,唯一的解释就是在 /etc/init.d/mysql 中有设置了查找位置。
    SP00F
        15
    SP00F  
    OP
       2017-01-16 08:16:20 +08:00
    @msg7086 thanks
    noahzh
        16
    noahzh  
       2017-01-16 08:55:56 +08:00
    启动时候,指定使用某个 cnf 就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4115 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:26 · PVG 13:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.