问题
我正在尝试在生产服务器上修改 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
,问题就解决了。
重要的提示
在 Unix 平台上,MySQL 会忽略可全世界写入的配置文件。
这是有意采取的一种安全措施。
答案4
如果它对其他人有帮助,在花了几个小时试图找出为什么 my.cnf 被忽略之后,我将所有者更改为“mysql”并且它起作用了。