MySQL
Backup & Recovery
innobackupex 2.4
MyFlash
Xtrabackup 8.0
secure_file_priv
MySQL Shell
MySQL Utilities — mysqlfrm
使用 sql_thread 进行数据恢复
binlog2sql
MySQL Binlog Server
mysqldump
备份脚本
Docs
01.MySQL
02.安装MySQL
03.MySQL的启动过程
04.用户管理
05.sql_safe_updates
06.mysql的体系结构
07.InnoDB undo log
08.mysql 日志
0801.mysqlbinlog
0803.binlog & relay log
0802.binlog
09.MySQL Replication
0902.Mysql 8.0 Replication
0901.Mysql 5.7 Replication
0903.Replication 主要配置
0904.如何彻底清除从库(slave)设置?
0905.CHANGE MASTER TO
0906.fast semi-sync Replication
10.mysql事务和锁
11.MySQL temp tables
12.Multi-Threaded-Slave
13.多源复制(多主一从)
slow query
Overview of MySQL 8.0 Programs
17.OPTIMIZE TABLE
16.GTID
MySQL 8.0.0 持久化全局参数
15.升级MySQL
18.存储引擎
14.MySQL Tablespace
REPAIR TABLE
High availability
MariaDB Galera Cluster
MySQL Group Replication-MGR
基于 Consul + MySQL 高可用
使用 RPM 安装 PXC
Galera Cluster for MySQL 监控状态说明
replication managerfor
Master High Availability
Orchestrator
Percona XtraDB Cluster
MySQL NDB Cluster
FQ
Could not increase number of max_open_files
MY-010055
ERROR 1118
index column size too large. the maximum column size is 767 bytes
ERROR 1064 (42000)
更新丢失
flush-hosts
GDB调试MySQL
extra_port
lower_case_table_names
MySQL主从复制中断
SQL错误(1075)
Porxy
proxysql
03.ProxySQL 实现主从读写分离
09.ProxySQL集群
08.禁止多路路由
07.链式规则( flagIN 和 flagOUT )
06.读写分离方法
05.ProxySQL的查询缓存功能
04.SQL语句的重写规则
02.ProxySQL的路由规则
01.管理后端节点
10.ProxySQL+组复制前言
DBLE
Mysql route
Shardingsphere
Performance Tuning and Optimization
AWR
压力测试
Mysql并发参数调整
mysql 中数据表 DATA_LENGTH & INDEX_LENGTH
01.MySQL体系结构
02.多实例管理(mysqld_multi)
03.MySQL内存结构
mysql 单机性能调整
tools
mysql utilities
percona-toolkit
pt-online-schema-change
pt-summary
gh-ost
windows 环境下 mysql 初始化
mysql主从同步检测脚本
本文档使用 MrDoc 发布
-
+
home page
mysql 单机性能调整
# 1.查看数据库及表的大小 ## 查看所有数据库容量大小 ``` mysql> select table_schema as '数据库',sum(table_rows) as '记录数',sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)' from information_schema.tables group by table_schema order by sum(data_length) desc, sum(index_length) desc; +--------------------+-----------+--------------+--------------+ | 数据库 | 记录数 | 数据容量(MB) | 索引容量(MB) | +--------------------+-----------+--------------+--------------+ | TD_OA_ARCHIVE | 206540801 | 23636.73 | 242.71 | | TD_OA | 15727727 | 2000.47 | 1126.59 | | crscell | 18358 | 5.05 | 4.00 | | mysql | 17949 | 3.40 | 0.06 | | BUS | 64670 | 3.34 | 0.81 | | TRAIN | 41209 | 3.08 | 1.30 | | td_app | 213 | 0.19 | 0.41 | | test | 1 | 0.00 | 0.00 | | information_schema | NULL | 0.00 | 0.00 | | performance_schema | 74026 | 0.00 | 0.00 | +--------------------+-----------+--------------+--------------+ 10 rows in set mysql> ``` ## 查看数据库使用大小 ``` mysql> use information_schema; Database changed mysql> select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='TD_OA'; +-----------+ | data | +-----------+ | 2006.53MB | +-----------+ 1 row in set mysql> ``` ## 查看表使用大小 ``` mysql> SELECT concat(ROUND(SUM(data_length / 1024 / 1024), 2), 'MB') AS data FROM tables WHERE table_schema = 'TD_OA' AND table_name = 'flow_rule'; +--------+ | data | +--------+ | 0.47MB | +--------+ 1 row in set mysql> ``` ## 查看指定数据库各表容量大小 ``` SELECT table_schema AS '数据库', table_name AS '表名', table_rows AS '记录数', TRUNCATE(data_length / 1024 / 1024, 2) AS '数据容量(MB)', TRUNCATE (index_length / 1024 / 1024, 2) AS '索引容量(MB)' FROM information_schema.tables WHERE table_schema = 'TD_OA' ORDER BY data_length DESC, index_length DESC; ``` # 2.如何查看表的存储引擎? 在MySQL中如何查看单个表的存储引擎? 如何查看整个数据库有那些表是某个特殊存储引擎,例如MyISAM存储引擎呢? a. ``` mysql> show create table test; +-------+----------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------+ | test | CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `name` varchar(12) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+----------------------------------------------+ 1 row in set (0.00 sec) mysql> ``` b. ``` mysql> show table status from MyDB where name='test' \G *************************** 1. row *************************** Name: test Engine: InnoDB Version: 10 Row_format: Compact Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2017-06-09 15:45:00 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.01 sec) ``` c. 查询整个MySQL实例里面存储引擎为MyISAM的表 ``` select table_catalog, table_schema, table_name, engine from information_schema.tables where engine='MyISAM'; ``` d.查询MyDB数据库里面存储引擎为MyISAM的表 ``` select table_catalog, table_schema, table_name, engine from information_schema.tables where table_schema='MyDB' and engine='MyISAM'; ``` # 3.指定路径创建表空间 表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都是存放在表空间中。 对于系统表空间来说,对应着文件系统中一个或多个实际文件; 对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。 MySQL 5.6.6版本后,我们自己创建的表默认是存储在独立表空间,会在Mysql的data目录下生成对应的表名.ibd文件,该文件包含了表的结构和数据。如果使用系统表空间,则数据都存在共享的表空间 ibdata1中 > 注意:对于独立表空间来说,每张表的表空间存放的只是数据、索引、和插入缓冲,其他类型的信息如Undo 信息,系统事务信息、二次写缓冲(double write buffer)等还是存在共享表空间中。所以共享表空间的大小一定还是会不断增大的。 MySQL 8.0版本开始,提供了指定数据文件目录创建表空间的功能。使用该功能,我们就可以很方便的通过指定路径创建表空间的方式,将表存放到指定的磁盘上。 ``` CREATE [UNDO] TABLESPACE tablespace_name [ADD DATAFILE 'file_name'] [AUTOEXTEND_SIZE [=] value] [FILE_BLOCK_SIZE = value] [ENCRYPTION [=] {'Y' | 'N'}] [ENGINE [=] engine_name] ``` - ADD DATAFILE:指定表空间的关联文件和路径,必须是.ibd结尾 - AUTOEXTEND_SIZE:8.0.13以后有用,当表空间满时扩容的大小,必须是4MB的倍数,最大为4G(8.0.24开始)。默认值为0,默认规则为:表空间小于1M,每次增加1页;表空间大于1M小于32M,每次增加1M;表空间大于32M,每次增加4M; - FILE_BLOCK_SIZE:定义表空间数据文件的块大小。默认为innodb_page_size,如使用默认值则只能存储未压缩的行格式(COMPACT, REDUNDANT, and DYNAMIC)。如存储压缩的表(ROW_FORMAT=COMPRESSED)则表的KEY_BLOCK_SIZE需等于FILE_BLOCK_SIZE/1024; - ENCRYPTION:是否静态加密 创建和使用表空间的示例如下 ``` mysql> CREATE TABLESPACE ts_test ADD DATAFILE '/data/mysql/log/ts_test.ibd' ENGINE=INNODB; Query OK, 0 rows affected (0.02 sec) mysql> create table test1 (id int) tablespace=ts_test; Query OK, 0 rows affected (0.04 sec) mysql> alter table test2 tablespace=ts_test; mysql> select * from information_schema.innodb_tablespaces where name='test1' \G *************************** 1. row *************************** SPACE: 148 NAME: ts_test FLAG: 18432 ROW_FORMAT: Any PAGE_SIZE: 16384 ZIP_PAGE_SIZE: 0 SPACE_TYPE: General FS_BLOCK_SIZE: 4096 FILE_SIZE: 131072 ALLOCATED_SIZE: 131072 AUTOEXTEND_SIZE: 0 SERVER_VERSION: 8.0.26 SPACE_VERSION: 1 ENCRYPTION: N STATE: normal 1 row in set (0.01 sec) mysql> select * from information_schema.files where tablespace_name='test1' \G *************************** 1. row *************************** FILE_ID: 148 FILE_NAME: /data/mysql/log/ts_test.ibd FILE_TYPE: TABLESPACE TABLESPACE_NAME: ts_test TABLE_CATALOG: TABLE_SCHEMA: NULL TABLE_NAME: NULL LOGFILE_GROUP_NAME: NULL LOGFILE_GROUP_NUMBER: NULL ENGINE: InnoDB FULLTEXT_KEYS: NULL DELETED_ROWS: NULL UPDATE_COUNT: NULL FREE_EXTENTS: 0 TOTAL_EXTENTS: 0 EXTENT_SIZE: 1048576 INITIAL_SIZE: 114688 MAXIMUM_SIZE: NULL AUTOEXTEND_SIZE: 1048576 CREATION_TIME: NULL LAST_UPDATE_TIME: NULL LAST_ACCESS_TIME: NULL RECOVER_TIME: NULL TRANSACTION_COUNTER: NULL VERSION: NULL ROW_FORMAT: NULL TABLE_ROWS: NULL AVG_ROW_LENGTH: NULL DATA_LENGTH: NULL MAX_DATA_LENGTH: NULL INDEX_LENGTH: NULL DATA_FREE: 0 CREATE_TIME: NULL UPDATE_TIME: NULL CHECK_TIME: NULL CHECKSUM: NULL STATUS: NORMAL EXTRA: NULL 1 row in set (0.00 sec) ``` **使用限制** 从 MySQL 8.0.21 开始,使用 DATA DIRECTORY 子句在数据目录之外创建的表和表分区仅限于 InnoDB 已知的目录,否则将报错; 已知目录可通过以下SQL检查 ``` mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories; +-------------------+------------------------+----------------------------------+ | @@datadir | @@innodb_data_home_dir | @@innodb_directories | +-------------------+------------------------+----------------------------------+ | /data/mysql/data/ | /data/mysql/data | /data/mysql/data;/data/mysql/log | +-------------------+------------------------+----------------------------------+ 1 row in set (0.01 sec) ``` 创建表空间不在以上目录时将报错 ``` mysql> CREATE TABLESPACE ts_tmp ADD DATAFILE '/tmp/ts_tmp.ibd' ENGINE=INNODB; ERROR 3121 (HY000): The DATAFILE location must be in a known directory. ``` 将目录添加到innodb_directories变量中。注意该变量只读,需修改配置文件并重启数据库; ``` [mysqld] innodb_directories="/data/mysql/data;/data/mysql/log;/tmp" ``` ``` mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories; +-------------------+------------------------+---------------------------------------+ | @@datadir | @@innodb_data_home_dir | @@innodb_directories | +-------------------+------------------------+---------------------------------------+ | /data/mysql/data/ | /data/mysql/data | /data/mysql/data;/data/mysql/log;/tmp | +-------------------+------------------------+---------------------------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLESPACE ts_tmp ADD DATAFILE '/tmp/ts_tmp.ibd' ENGINE=INNODB; Query OK, 0 rows affected (10.03 sec) ``` 建表时指定外部目录,MySQL将自动在指定外部路径下创建以数据库命名的目录,保存ibd文件 ``` mysql> create table t_extrnal_1 (id int,name varchar(64)) DATA DIRECTORY = '/data/mysql/log'; Query OK, 0 rows affected (0.05 sec) [root@node1 ~]# ll /data/mysql/log/test2/ total 224 -rw-r----- 1 mysql mysql 114688 Aug 17 23:44 t_extrnal_1.ibd -rw-r----- 1 mysql mysql 114688 Aug 17 23:39 t_extrnal.ibd ``` # 4.参数优化 Mysqld 数据库的参数设置有两种类型, 一种是全局参数,影响服务器的全局操作;另一种是会话级参数,只影响当前的客户端连接的相关操作。 服务器启动时,所有全局参数都初始化为默认值。可以在初始化文件或命令行中指定的选项来更改这些默认值。服务器启动后,通过连接服务器并执行 “SET GLOBAL var_name” 语句可以更改动态全局参数。要想更改全局参数,必须具有 SUPER 权限。全局参数的修改只对新的连接生效,已有的客户端连接并不会生效。 服务器还可以为每个客户端连接维护会话级参数,客户端连接时使用相应全局参数的当前值对客户端会话参数进行初始化。客户可以通过 “SET SESSION var_name” 语句来更改动态会话参数。设置会话级参数不需要特殊权限,但每个客户端可以只更改自己的会话级参数,不能更改其它客户的会话级参数。 不指定设置的参数类型时,默认设置的是会话级参数。 ## 4.1.max_connection MySQL允许最大的进程连接数,如果经常出现Too Many Connections的错误提示,则需要增大此值。 调整mysql的最大socket连接数为1000(默认100),该数值对于一般的中型项目,虚拟机配置不是很高的环境下,是足够应对。对于大型的项目来说,上万个连接数也是可能的,所以要根据项目情况,和环境配置进行合理调整。 调整max_connetion的方法: a.修改配置文件  b.命令行修改 查看当前最大连接数 ``` mysql> show variables like "max_connections"; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 500 | +-----------------+-------+ 1 row in set ``` 设置最大连接数 ``` set global max_connections=500; ``` 查看当前建立的socket连接 ``` mysql> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 16 | | Threads_connected | 15 | | Threads_created | 31 | | Threads_running | 1 | +-------------------+-------+ 4 rows in set ``` 查看连接状态 ``` mysql> SELECT substring_index(host, ':',1) AS host_name,state,count(*) FROM information_schema.processlist GROUP BY state,host_name; +-----------+--------------+----------+ | host_name | state | count(*) | +-----------+--------------+----------+ | | | 22 | | | executing | 1 | | | Sending data | 1 | +-----------+--------------+----------+ 3 rows in set ``` ## 4.2.max_connect_errors = 6000 设置每个主机的连接请求异常中断的最大次数,当超过该次数,MYSQL服务器将禁止host的连接请求,直到mysql服务器重启或通过flush hosts 命令清空此host的相关信息 ## 4.3..innodb_file_per_table 开启独占表空间模式之后,每个表都有自己独立的表空间物理文件,所有的数据以及索引都会存储在该文件中,这样方便备份以及恢复数据。 当项目足够的庞大,有几百张表的时候,如果不开启表独占模式,Innodb默认是会将所有的表数据存储到一个共享表空间中,这样的话就会大大影响数据写入读取性能,同时也方便管理备份数据。 ``` mysql> show variables like "innodb_file_per_table"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set ``` ## 4.4.innodb_buffer_pool_size 该配置的大小推荐配置该服务器内存的60%,或者80%。他的作用有两个: (1)当数据写入时,他会优先写入buffer区域,前提是这个区域的空间够大,这样的话就能将数据先写入到buffer区中,提高写数据性能。 (2)同样的,如果buffer中的区域足够大,大部分数据在buffer区中,命中缓存中记录就非常的高,从而提高读数据的性能。 ``` mysql> show variables like "innodb_buffer_pool_size "; +-------------------------+-------------+ | Variable_name | Value | +-------------------------+-------------+ | innodb_buffer_pool_size | 21474836480 | +-------------------------+-------------+ 1 row in set ``` ## 4.5.innodb_log_file_size innodb_log_buffer_size innodb_log_file_size对应着undo/redo log区域 ; innodb_log_buffer_size对应着undo/redo buffer区域 。 当数据库在不断地对undo/redo log写入数据时,当该文件达到一定大小后,就会进行一次切换分割,在这个期间undo/redo buffer是不能往log文件flush数据的,那就是说明不能执行sql语句,这样就会导致这段时间mysql不能提供服务。所以设置innodb_log_buffer_size的大小来应对当log日志进行切换时,接受这段时间的数据。而innodb_log_file_size也不宜设置得过大,因为当数据崩溃后,重新启动的时候,mysql会重新执行log中内容,如果文件过大的话,就会十分影响性能。 ``` mysql> show variables like "innodb_log_file_size "; +----------------------+-----------+ | Variable_name | Value | +----------------------+-----------+ | innodb_log_file_size | 134217728 | +----------------------+-----------+ 1 row in set mysql> show variables like "innodb_log_buffer_size "; +------------------------+---------+ | Variable_name | Value | +------------------------+---------+ | innodb_log_buffer_size | 8388608 | +------------------------+---------+ 1 row in set ``` ## 4.6.innodb_flush_log_at_trx_commit=2 配置内容,需放在[mysql_safe] 段 innodb_flush_log_at_trx_commit = 1: mysql的默认配置,也是保持原子性特性最好的,因为当一个事务进行提交后,log buffer区就会立即flush到磁盘中,对磁盘进行写入。 innodb_flush_log_at_trx_commit = 0: 当事务进行提交后,写入到log buffer区中就会返回提示事务提交完成。然后mysql就会每秒区轮询将buffer中数据flush到log file中。这样的性能是最好的,因为不用写入到磁盘中,但同时也是最不安全的,因为一旦mysql崩溃了,就会丢失1秒的数据。 innodb_flush_log_at_trx_commit = 2: 该配置就是一个折中的配置,从log buffer到log file中其实是首先要write到系统内容中内存中,然后再flush到系统的磁盘中。该配置就是当一个事务发起时,当write到系统内核的内存时,就相当于完成,然后mysql每秒去轮询flush到磁盘中。这样的话只要保证系统不挂,就不会丢失那一秒的数据。 ``` mysql> show variables like "innodb_flush_log_at_trx_commit "; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 2 | +--------------------------------+-------+ 1 row in set ``` ## 4.7.innodb_data_file_path=ibdata1:1G;ibdata2:1G;ibdata3:1G:autoextend 虽然innodb_file_per_table 中将每个表独占一个文件,但如果这个文件无限制增长,他依然是系统文件维度的磁盘性能瓶颈。该配置的意思是当文件大小到达1G的时候就会起一个新的ibdata1文件,如此类推下去。 ``` mysql> show variables like "innodb_data_file_path"; +-----------------------+------------------------+ | Variable_name | Value | +-----------------------+------------------------+ | innodb_data_file_path | ibdata1:12M:autoextend | +-----------------------+------------------------+ 1 row in set mysql> ``` ## 4.8.key_buffer_size: 为了最小化磁盘的 I/O , MyISAM 存储引擎的表使用键高速缓存来缓存索引,这个键高速缓存的大小则通过 key-buffer-size 参数来设置。如果应用系统中使用的表以 MyISAM 存储引擎为主,则应该适当增加该参数的值,以便尽可能的缓存索引,提高访问的速度。 索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8m),我的mysql主机有2gb内存,所以我把它改为 402649088(400mb)。 默认情况下,所有的索引都使用相同的键高速缓存,当访问的索引不在缓存中时,使用 LRU ( Least Recently Used 最近最少使用)算法来替换缓存中最近最少使用的索引块。为了进一步避免对键高速缓存的争用,从 MySQL5.1 开始,可以设置多个键高速缓存,并为不同的索引键指定使用的键高速缓存。 如何修改高速键缓存的值,如何设置多个键高速缓存,以及如何为不同的索引指定不同的缓存: 显示当前的参数大小,为16M: ``` mysql> show variables like 'key_buffer_size'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | key_buffer_size | 16384 | +-----------------+-------+ 1 row in set (0.00 sec) ``` 修改参数值到200M: ``` mysql> set global key_buffer_size=204800; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'key_buffer_size'; +-----------------+--------+ | Variable_name | Value | +-----------------+--------+ | key_buffer_size | 204800 | +-----------------+--------+ 1 row in set (0.00 sec) ``` 如何设置多个键缓存? 设置 hot_cache 的键缓存 100M , cold_cache 的键缓存 100M ,另外还有 200M 的默认的键缓存。如果索引不指定键缓存,则会放在默认的键缓存中。 ``` mysql> set global hot_cache.key_buffer_size=102400; Query OK, 0 rows affected (0.00 sec) mysql> set global cold_cache.key_buffer_size= 1024 00; Query OK, 0 rows affected (0.01 sec) mysql> show variables like 'key_buffer_size'; +-----------------+--------+ | Variable_name | Value | +-----------------+--------+ | key_buffer_size | 204800 | +-----------------+--------+ 1 row in set (0.00 sec) ``` 如果要显示设置的多键缓存的值,可以使用: ``` mysql> SELECT @@global.hot_cache.key_buffer_size; +------------------------------------+ | @@global.hot_cache.key_buffer_size | +------------------------------------+ | 102400 | +------------------------------------+ 1 row in set (0.03 sec) mysql> SELECT @@global.cold_cache.key_buffer_size; +-------------------------------------+ | @@global.cold_cache.key_buffer_size | +-------------------------------------+ | 102400 | +-------------------------------------+ 1 row in set (0.00 sec) ``` 指定不同的索引使用不同的键缓存: ``` mysql> CACHE INDEX test1 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test1 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) mysql> CACHE INDEX test2 in hot_cache; +------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------------+----------+----------+ | test .test2 | assign_to_keycache | status | OK | +------------+--------------------+----------+----------+ 1 row in set (0.00 sec) ``` 通常在数据库刚刚启动的时候,需要等待数据库热起来,也就是等待数据被缓存到缓存区中,这段时间数据库会因为 buffer 的命中率低而导致应用的访问效率不高。使用键高速缓存的时候,可以通过命令将索引预加载到缓存区中,大大缩短了数据库预热的时间。 ``` mysql> LOAD INDEX INTO CACHE test1,test2 IGNORE LEAVES; +------------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------------+----------+----------+ | test .test1 | preload_keys | status | OK | | test .test2 | preload_keys | status | OK | +------------+--------------+----------+----------+ 2 rows in set (3.89 sec) ``` 如果已经使用 CACHE INDEX 语句为索引分配了一个键高速缓冲,预加载可以将索引块放入该缓存,否则,索引块将被加载到默认的键高速缓冲。 # 5.mysql内存计算公式 ``` mysql used mem = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + max_connections * ( read_buffer_size + read_rnd_buffer_size + sort_buffer_size+ join_buffer_size + binlog_cache_size + thread_stack ) ``` step 1.统计这段时间的系统最大的MAX_used_connections ``` mysql> show global status like 'max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 31 | +----------------------+-------+ 1 row in set mysql> ``` step 2.可自动计算自己的当前配置最大的内存消耗 ``` SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size'; SHOW VARIABLES LIKE 'innodb_log_buffer_size'; SHOW VARIABLES LIKE 'thread_stack'; SET @kilo_bytes = 1024; SET @mega_bytes = @kilo_bytes * 1024; SET @giga_bytes = @mega_bytes * 1024; SET @innodb_buffer_pool_size = 2 * @giga_bytes; SET @innodb_additional_mem_pool_size = 16 * @mega_bytes; SET @innodb_log_buffer_size = 8 * @mega_bytes; SET @thread_stack = 192 * @kilo_bytes; SELECT ( @@key_buffer_size + @@query_cache_size + @@tmp_table_size + @innodb_buffer_pool_size + @innodb_additional_mem_pool_size + @innodb_log_buffer_size + @@max_connections * ( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@binlog_cache_size + @thread_stack ) ) / @giga_bytes AS MAX_MEMORY_GB; ``` 为什么要这样计算? 1.系统运行一段时间并没有爆出大的问题,说明innodb_buffer_pool_size 设置的并没有特别大的所以这里使用了 innodb_buffer_pool_size 的当前值. 2.read_buffer_size, read_rnd_buffer_size, sort_buffer_size, join_buffer_size, join_buffer_size, tmp_table_size 需要和当前的connections 进行一个累加,一个连接使用的内存的可能,我们按照最大化来计算实际上不可能每个连接使用的 read_bufer_size, read_rnd_buffer_size, sort_buffer_size, join_buffer_size, join_buffer_size, timp_table_size 都是最大化的设置, 所以这里给出的 max_memory_GB 也是符合这个意思的. 在计算完毕后,我们其实可以通过 pt-summary 的第三方工具对系统进行一个检查 ``` mysqladmin -r -i 1 -c 60 extended-status | egrep "Innodb_buffer_pool_read_requests|Innodb_buffer_pool_reads" ``` MYSQL 8 已经支持了 innodb_dedicated_server,通过打开这个设置自动开始对MYSQL的内存进行分配和计算, 但需要注意的是,MYSQL 的 8.0 中的 innodb_dedicated_server 并不适用于复杂环境方面的MYSQL 数据库服务器. # 6.my.cnf 优化: ``` [mysqld] skip-locking(取消文件系统的外部锁) skip-name-resolve(不进行域名反解析,注意由此带来的权限/授权问题) key_buffer_size = 256M(分配给MyISAM索引缓存的内存总数)对于内存在4GB左右的服务器该参数可设置为256M或384M。 注意:该参数值设置的过大反而会是服务器整体效率降低! max_allowed_packet = 4M(允许最大的包大小) thread_stack = 256K(每个线程的大小) table_cache = 128K(缓存可重用的线程数) back_log = 384(临时停止响应新请求前在短时间内可以堆起多少请求,如果你需要在短时间内允许大量连接,可以增加该数值) sort_buffer_size = 2M(分配给每个线程中处理排序) read_buffer_size = 2M(读取的索引缓冲区大小) join_buffer_size = 2M(分配给每个线程中处理扫描表连接及索引的内存) myisam_sort_buffer_size = 64M(myisam引擎排序缓冲区的大小) table_cache = 512(缓存数据表的数量,避免重复打开表的开销) thread_cache_size = 64(缓存可重用线程数,见笑创建新线程的开销) query_cache_size = 64M(控制分配给查询缓存的内存总量) tmp_table_size = 256M(指定mysql缓存的内存大小) max_connections = 768(最大连接数)指mysql整个的最大连接数 max_connect_errors = 10000(最大连接错误数据) wait_timeout = 10(超时时间,可以避免攻击) thread_concurrency = 8(根据cpu数量来设置) skip-bdb 禁用不必要的引擎 skip-networking(关闭mysql tcp/ip连接方式) Log-slow-queries = /var/log/mysqlslowqueries.log long_query_time = 4(设定慢查询的时间) skip-host-cache(提高mysql速度的) open_files_limit = 4096(打开文件数) interactive_timeout = 10(服务器在关闭它前在一个交互连接上等待行动的秒数) max_user_connections = 500(最大用户连接数) key_buffer_size 默认为218 调到128最佳 query_cache_size tmp_table_size 默认为16M 调到64-256最挂 innodb_thread_concurrency=8 你的服务器CPU有几个就设置为几,默认为8 table_cache=1024 物理内存越大,设置就越大.默认为2402,调到512-1024最佳 innodb_additional_mem_pool_size=8M 默认为2M innodb_flush_log_at_trx_commit=0 等到innodb_log_buffer_size列队满后再统一储存,默认为1 innodb_log_buffer_size=4M 默认为1M read_buffer_size=4M 默认为64K read_rnd_buffer_size 随机读 缓存区 默认为256K sort_buffer_size=32M 默认为256K max_connections=1024 默认为1210 thread_cache_size=120 默认为60 ``` # 7.性能测试 1.mysql 自带测试工具 ``` # perl -MCPAN -e shell cpan> install DBI cpan> install DBD::mysql # cd sql-bench # perl run-all-tests --server=server_name ``` server_name是一个支持的服务器。要获得所有选项和支持的服务器,调用命令: ``` # perl run-all-tests --help ``` 2.mysqlreport http://hackmysql.com/mysqlreport
Seven
Feb. 27, 2023, 12:32 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password