服务器mysql 报警:

2017-11-17T04:02:34.400257Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)

2017-11-17T04:02:34.400333Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)

2017-11-17T04:02:34.573111Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).


# 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 = /application/mysql

datadir = /data/3307/data

port = 3307

server_id = 1

#lower_case_table=1

character_set_server=utf8

#autocommit =off

innodb_flush_log_at_trx_commit=1

skip_name_resolve=ON

relay_log=slave_relay_binlog

innodb_strict_mode=ON

log_bin=mysql-bin

log-bin-index=/data/3307/data/mysql-bin.index

innodb_flush_method=O_DIRECT

lower_case_table_names=1

#binlog_do_db=test

#bind_address=192.168.1.128



plugin_dir=/application/mysql/lib/plugin


ft_min_word_len =1

innodb_data_home_dir=/data/3307/data

innodb_log_group_home_dir=/data/3307/data

#lc-messages-dir=/usr/local/mysql/share/mysql/


#innodb_force_recovery=1


#innodb_undo_directory=/mydata/undo


#innodb_undo_tablespaces=4


log_slave_updates=1

master-info-repository  = TABLE

relay-log-info-repository = TABLE

relay-log=/data/3307/data/relay-mysql-bin

sync_master_info= 1

sync_relay_log=1

sync_relay_log_info=1


#gtid-mode=on


#enforce-gtid-consistency=true

#rpl_semi_sync_master_enabled=ON

#rpl_semi_sync_slave_enabled=ON


#auto_increment_offset=2

#auto_increment_increment=2

log_error="/data/3307/data/mysql_master.err"

socket=/tmp/mysql3307.sock

#innodb_force_recovery = 1

[xtrabackup]

socket=/tmp/mysql3307.sock

# 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



mysql> show variables like '%open%'

    -> ;

+----------------------------+----------+

| Variable_name              | Value    |

+----------------------------+----------+

| have_openssl               | DISABLED |

| innodb_open_files          | 431      |

| open_files_limit           | 1024     |

| table_open_cache           | 431      |

| table_open_cache_instances | 16       |

+----------------------------+----------+

max_connections                  151    







MyISAM和CSV表打开时占用2个文件描述符,Innodb则需要1个文件描述符。一些日志信息(relay log,binlog,error-log等)也需要文件描述符。table_open_cache对MyISAM有效,对Innodb无效。当运行 flush tables 关闭表的时候,只对MyISAM表有效,即关闭有MISAM表的文件描述符,Innodb表也会关闭,但是文件描述符不会关。
       当表都是MyISAM,在极端的情况下,table_open_cache数目的表全部被打开(512张)就会占用掉1024个文件描述符。而open_files_limit是1024的话,就会出现报错的情况(本文例子的情况)。所以如果是有大量的 MyISAM 表,那么就需要特别注意打开文件数是否会超出限制了。
       总之,确实设置open_files_limit的时候,先要知道table_open_cache 为多少,再加上inodb表的数目和一些日志的数目。上面的结果和系统的ulimit没有关系(ubuntu默认apt下来的实例),要是不是默认安装的实例呢?请继续看:
       在测试中发现,设置OS的文件描述符(/etc/security/limits.conf)值是无效的,即MySQL启动后open_files_limit始终以my.cnf中设置的参数open_files_limit为准。(版本MySQL5.5.29 ubuntu0.12.04.1),而在非Ubuntu中是按照他们(os和mysql)哪个最高用哪个的方法,通过 cat /proc/10415/limits 查看,依然都是数据库配置文件(open_files_limit)中设置的值。怀疑是ubuntu定制mysql的问题(apt下来的mysql)。

而用mysqld_safe开启的实例(非apt-get install 安装),则按照下面的规则:

默认设置的open_files_limit 比其他相关的参数都大。[max_connections*5和10+max_connections+table_cache_size*2 大]

一::ulimit -n :修改 my.cnf 限制
open_files_limit = :重启 mysql:show global variables like ;
| open_files_limit |  |

二:
注释 open_files_limit
| open_files_limit |  三::ulimit -n :修改 my.cnf 限制
open_files_limit = :重启 mysql:show global variables like ;
| open_files_limit |  四:
注释 open_files_limit
| open_files_limit |

 注意:open_files_limit 大小和 max_connections*5需要比较,那个最大就用那个值来设置open_files_limit 。【比较open_files_limit,max_connections*5和10+max_connections+table_cache_size*2中最大值】

--my.cnf--
open_files_limit = 5000max_connections = 1024mysql> show global  variables like '%open%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| open_files_limit  | 5120     |   #1024*5 > 5000+-------------------+----------+

View Code

vi /etc/security/limits.conf

mysql            soft    nofile          65536mysql            hard    nofile          65536

总结:
      
所以在配置open_files_limit的时候,设置多大合适,需要知道具体的表数目和类型等,具体情况需要自己分析。没有配置的则需要注意配置OS的ulimit(启动前设置)和max_connections的大小。而用apt-get 下来的mysql实例则都是按照open_files_limit和max_connections 来比较设置的,和OS的ulimit无关。