mysql my.cnf 被忽略

mysql my.cnf 被忽略

问题

我正在尝试在生产服务器上修改 my.cnf 值,但更改在之后没有生效sudo service mysql restart,在我的开发服务器上使用 my.cnf 的精确副本(下载并替换原件)后,所做的更改可在 mysql 命令行中的显示变量中看到。

my.cnf 位于 /etc/mysql/my.cnf

sudo find / -name my.cnf
/etc/mysql/my.cnf

因此整个系统中只存在一个文件。

生产是 ubuntu 10.04 LTS 64位
开发是 ubuntu 11.10 32位

Mysql版本分别为5.1.61和5.1.62。

更新2:

运行 mysql stop 后,mysql status 返回 mysql stop/waiting,如果我运行top -b | grep mysql

27652 root      20   0  4096  424  420 S    0  0.0   0:00.01 mysqld_safe
27769 mysql     20   0  392m  57m 7236 S    0  1.5 119116,08 mysqld

看起来它仍在运行,而且时间对我来说看起来不太好,但我现在担心如果我终止这些/这个进程,我将无法再次运行 mysql,而且在生产中这很糟糕:S。

我意识到这可能不是一个可以回答的问题,但是终止这些进程,然后运行服务 mysql 启动,这会让 mysql 再次运行吗? - 此外,上述进程是否有正常的数字?

更新:

这是否意味着它从 my.cnf 获取设置...但不使用它?现在非常困惑。
最后它得到了 innodb_buffer.. 设置。

mysqld --print-defaults
mysqld would have been started with the following arguments:
--user=mysql --socket=/var/run/mysqld/mysqld.sock --port=3306 --basedir=/usr --datadir=/var/lib/mysql --tmpdir=/tmp --skip-external-locking --bind-address=127.0.0.1 --key_buffer=16M --max_allowed_packet=16M --thread_stack=192K --thread_cache_size=8 --myisam-recover=BACKUP --query_cache_limit=1M --query_cache_size=16M --log_error=/var/log/mysql/error.log --expire_logs_days=9 --max_binlog_size=100M --innodb_file_per_table=1 --innodb_buffer_pool_size=500M --innodb_buffer_pool_size=500M --user=mysql --socket=/var/run/mysqld/mysqld.sock --port=3306 --basedir=/usr --datadir=/var/lib/mysql --tmpdir=/tmp --skip-external-locking --bind-address=127.0.0.1 --key_buffer=16M --max_allowed_packet=16M --thread_stack=192K --thread_cache_size=8 --myisam-recover=BACKUP --query_cache_limit=1M --query_cache_size=16M --log_error=/var/log/mysql/error.log --expire_logs_days=9 --max_binlog_size=100M --innodb_file_per_table=1 --innodb_buffer_pool_size=500M --innodb_buffer_pool_size=500M

我的cnf

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
user        = mysql
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
skip-external-locking
bind-address        = 127.0.0.1
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit   = 1M
query_cache_size        = 16M
log_error                = /var/log/mysql/error.log
expire_logs_days    = 10
max_binlog_size         = 100M
innodb_file_per_table = 1

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]

[isamchk]
key_buffer      = 16M

!includedir /etc/mysql/conf.d/

答案1

有什么有趣的内容吗/etc/mysql/conf.d/?您使用的 Mysql 版本应该会按照配置文件名的顺序解析my.cnf中的任何内容/etc/mysql/conf.d/。在以前的版本中,顺序可能有些不确定。

链中最后设置的任何值都应该获胜,这也许可以解释为什么您的更改my.cnf没有更新服务器;如果后面的文件覆盖了您的设置。

如果什么都没有,/etc/mysql/conf.d/请创建一个名为innodb.cnf(不会解析任何不以 结尾的内容.cnf) 的文件,仅包含这两行,然后查看重启后 innodb 设置是否更新。

[mysqld]
innodb_buffer_pool_size = 500M

来自文档的信息:

username$ mysqld --verbose --help | grep '/my.cnf' -B 1

Default options are read from the following files in the given order:
/etc/my.cnf 
/etc/mysql/my.cnf 
/usr/local/mysql/etc/my.cnf 
~/.my.cnf 

详细信息请参阅 MySQL 文档查看下方Table 4.2

可以使用!include选项文件中的指令来包含其他选项文件并!includedir在特定目录中搜​​索选项文件.....

...MySQL 不保证目录中选项文件的读取顺序...

在 Unix 操作系统上,使用 !includedir 指令查找和包含的任何文件的文件名都必须以 结尾.cnf。在 Windows 上,此指令会检查扩展名为.ini或 的文件.cnf

答案2

如果你想在 Linux 系统上知道你的 mysqld 是否真的在读取这个特定的文件,我建议使用 strace:

strace -e trace=open mysqld

这将显示 mysqld 进程在启动期间打开的所有文件。在我们的例子中:

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libaio.so.1", O_RDONLY)    = 3
open("/lib64/libm.so.6", O_RDONLY)      = 3
open("/lib64/librt.so.1", O_RDONLY)     = 3
open("/lib64/libcrypt.so.1", O_RDONLY)  = 3
open("/lib64/libdl.so.2", O_RDONLY)     = 3
open("/usr/lib64/libssl.so.10", O_RDONLY) = 3
open("/lib64/libcrypto.so.10", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY)      = 3
open("/usr/lib64/libfreebl3.so", O_RDONLY) = 3
open("/lib64/libgssapi_krb5.so.2", O_RDONLY) = 3
open("/lib64/libkrb5.so.3", O_RDONLY)   = 3
open("/lib64/libcom_err.so.2", O_RDONLY) = 3
open("/lib64/libk5crypto.so.3", O_RDONLY) = 3
open("/lib64/libz.so.1", O_RDONLY)      = 3
open("/lib64/libkrb5support.so.0", O_RDONLY) = 3
open("/lib64/libkeyutils.so.1", O_RDONLY) = 3
open("/lib64/libresolv.so.2", O_RDONLY) = 3
open("/usr/lib64/libselinux.so.1", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("/etc/my.cnf", O_RDONLY)           = 3
open("/etc/localtime", O_RDONLY)        = 3
open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 3
open("/proc/sys/crypto/fips_enabled", O_RDONLY) = 3

在我的例子中,即使 my.cnf 上定义了该属性 (query_cache_size),它也被忽略了。升级到 Percona-XtraDB-Cluster-server-55.x86_64 1:5.5.34-25.9.607.rhel6 后发生了这种情况。

最后我通过在命令行上指定来临时解决了它:

/etc/init.d/mysql start --query_cache_size=0

对于 Percona Cluster(基于 Galera),您必须使用 bootstrap 启动第一个节点:/etc/init.d/mysql bootstrap-pxc --query_cache_size=0

答案3

my.cnf我也遇到了同样的问题被忽略,就我而言,文件的权限是错误的。

它的所有者为 root,模式设置为 600。

sudo chmod 644 my.cnf

我将其改为644,问题就解决了。

重要的提示

来自 MySQL 文档

在 Unix 平台上,MySQL 会忽略可全世界写入的配置文件。

这是有意采取的一种安全措施。

答案4

如果它对其他人有帮助,在花了几个小时试图找出为什么 my.cnf 被忽略之后,我将所有者更改为“mysql”并且它起作用了。

相关内容