-
1、lower_case_table_names控制数据库名和表名是否区分大小写,如果设置为0,是区分大小写的;设置为1,是不区分大小写的。Rds mysql主库和只读副本该参数需要一致,复制可能导致复制中断。该参数非动态参数,修改需要重启mysql进程。建议将该值设置为1。 2、sql_modeMysql对数据库操作的约束集合。主库和只读副本该参数值必须一致,否则会出现复制中断。例如:STRICT_TRANS_TABLES:在该模式下,如果一个值不能**到一个事务表中,则中断当前的操作,例如值超过字段长度、数据类型不一致等。如果没有设置该模式,上述场景就不会报错。我们建议您不要修改sql_mode参数的值。 3、relay_log_recoverSlave宕机重启后,对relay-log的处理方式。当slave宕机后,假如relay_log损坏,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从MASTER上索取日志,保证relay的完整性。默认情况下该功能是关闭的。建议在开启此功能。 4、relay_log_info_repository决定从库的重做信息以何种方式保存。FILE:relay-log.info,TABLE: mysql.slave_relay_log_info设置为file,sql线程先提交事务,再记录relay.info文件。假如在relay.info刷盘那一刻宕机,relay.info文件中没有记录,那么从库重启mysql进程后们就会执行两边同样的sql,导致同步复制报错。设置为table,sql线程执行完事务后,立即更新slave_relay_log_info表,如果在更新过程中宕机,则事务会回滚,slave_relay_log_info表并不会记录同步的点,下次重新同步时,从之前的pos点再次执行。我们建议你将该值设置为table. 5、binlog_formatMySQL记录binlog的内容格式。STATEMENT模式(SBR):Binlog记录的只是sql语句。ROW模式(RBR):Binlog记录完成的数据变更记录。MIXED模式(MBR):由mysql决定记录的格式,bug较多,常常造成主从数据不一致。https://dev.mysql.com/doc/refman/5.7/en/binary-log-mixed.html基于RBR的复制是最安全的复制,slave需要的行锁也更少。其他格式可能导致数据不一致。Mysql 5.7可以开启binlog_rows_query_log_events,让binlog记录events的同时,也记录原始SQL.。建议值ROW。 6、log_slave_updates对于MySQL5.6该参数不能设置为OFF,否则备机或只读副本将无法启动。
-
在使用RDS MySQL的过程中,经常会遇见以下ERROR 2013错误。该如何处理呢? 问题原因:1、wait_timeout,interactive_timeout参数设置过小,连接超时后被mysql中止。2、mysql数据库频繁重启。解决措施:1、查询实例状态。确认数据库实例是否刚刚重启过:可以通过查看错误日志或status命令Uptime 代表实例的运行时间,数据库并没有频繁重启,客户端连接空闲一会就被断开,如果数据库频繁重启,请联系华为技服介入排查。2、查看参数设置参数设置过小,mysql会自动断开超时的空连接。3、修改参数组将参数interactive_timeout的值设置为100即可。
-
本帖最后由 小驴涛咪 于 2017-12-8 11:03 编辑死锁在MySQL数据库中是较为常见的现象,多数情况是业务逻辑导致的。 定位死锁原因当然可以访问数据库使用show engineinnodb status查看死锁信息。 也可以在console端的错误日志中查看,很简单,只需要需改一个参数。 将参数innodb_print_all_deadlocks的值修改为ON即可。
-
本帖最后由 小驴涛咪 于 2017-12-8 10:42 编辑HA实例+只读副本的数据库架构,只读副本可以承载只读业务,但是基于mysql复制的数据同步机制,主库频繁的更新操作,势必导致只读副本的同步延迟较高,如下所示。 mysql> show slave status \G; *************************** 1. row*************************** -----Slave_IO_Running: YesSlave_SQL_Running: Yes-------Seconds_Behind_Master: 9905这时修改参数innodb_flush_log_at_trx_commit的值为2,sync_binlog的值为0,使只读库加快同步进度,待主备数据同步后,再恢复原值。针对数据一致性要求不高的只读业务,可以不恢复原值。附:参数含义1、innodb_flush_log_at_trx_commit控制redolog何时落盘。innodb_flush_log_at_trx_commit=0:事务提交时,MySQL不会去刷新日志缓冲区的内容,有MASTER线程每隔1s将缓冲区中文件刷新到日志文件中。innodb_flush_log_at_trx_commit=1:事务提交时,会将日志缓冲区的日志写入到文件中,同时会刷新到磁盘中,保证数据库事务不丢数据。innodb_flush_log_at_trx_commit=2:事务提交时,会将日志缓冲区的日志写入到文件中(OS Cache)中,由文件系统负责刷新至磁盘文件中。innodb_flush_log_at_trx_commit数据库宕机OS宕机0丢失最多1s的数据丢失最多1s的数据1不丢数据不丢数据2不丢数据丢失最多1s的数据2、sync_binlog控制binlog何时落盘。sync_binlog=0:事务提交前时,MySQL将binlog信息写入binlog文件(OS Cache)中,但是MySQL不控制binlog的刷新操作,由文件系统控制其缓存的刷新。sync_binlog=1:每提交一个事务,MySQL都会把binlog刷新到磁盘中。这样数据库的安全性最高,性能损耗也是最大的。sync_binlog=N(N>0):表示每N次事务提交,MySQL调用文件系统的刷新操作将缓存刷新到磁盘中。 当然与主备复制效率相关的参数不止这两个,例如innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method,master_info_repository、relay_log_info_repository,slave_parallel_workers,slave-parallel-type(5.7),这些参数建议在数据库创建前做好优化。
-
本帖最后由 华为云数据库 于 2017-11-30 22:51 编辑从10月26日到11月7日,华为云数据库服务接连在华为云中国行西安站、济南站、成都站高调亮相,现场与200 家以上企业客户交流数据库云上解决方案,探讨数据库使用过程中的热点、痛点问题。华为云数据库服务高级营销经理李天武、高级产品经理姜皓楠先后做了《华为云数据库服务让您更专注应用开发》的主题分享。华为云数据库服务高级营销经理李天武在分享华为云数据库服务高级产品经理姜皓楠在分享四大优势保驾护航从配置到使用只需短短的几分钟时间,真正做到即开即用。也可以按照业务需求,灵活关停服务,为您节省企业成本,做到用多少开多少。可以根据业务涨跌情况随时伸缩资源,避免错失发展机遇或浪费固定投入,让您更合理地配置资源。全系列数据库支持高可用架构,让您安心使用。数据库层多副本扩展,存储层采用分布式块存储的多副本冗余结构,保证数据可靠不丢失。提供多种监控视图及日志查询,让你随时了解数据库实例操作系统及数据库引擎的运行状况。两大自研优化数据库,彰显华为领先的研发实力华为自研兼容MySQL的分布式数据库 Taurus,采用“计算与存储分离架构”和首创的全局缓冲池(CBP)技术,性能指标全面领跑MySQL,同时对用户数据提供金融级的可靠保障,成本却是商用数据库的1/10,是任何可以使用关系型数据库的企业的绝佳选择。Taurus性能是标准MySQL的数倍,AZ内读0延迟,跨AZ数据秒级延迟,能轻松承载“礼包兑换”、“抢红包”、“视频直播”等业务系统访问压力,让您从容应对业务高峰期系统访问量、用户量、流量突发问题。Taurus可弹性扩容,按需升级,扩展节点可多达15个,可突破业务增长后的性能瓶颈,赋予您更高的生产力。华为基于MySQL内核源码优化的数据库 HWSQL, 在不改变硬件配置的前提下,相比原生MySQL 5.6,在性能方面大幅提升,包括:1. 高并发情况下,TPS 负载能力提升 10 倍以上。2. 正常并发情况下,QPS峰值提高 4 倍多。3. 极端负载情况下,主从复制延迟从原生 MySQL 5.6 的 1000 多秒降到1秒以内,极大地减少了数据丢失的可能性。配套其他产品,提供完整的云数据库解决方案华为云数据库服务目前支持六款业界流行的数据库引擎,可以应对不同场景下的多种业务需求。此外,华为云数据库服务还可以搭配其他云服务产品,提供完整的云数据库解决方案,包括:1. 搭配分布式数据库中间件DDM使用RDS,实现分库分表、对应用透明的自动读写分离和读负载均衡。2. 搭配数据库安全服务DBSS使用RDS,可以防止 SQL 注入攻击,防止敏感数据泄露,提供数据库级别的审计功能,以及遵从行业安全合规性,全程保障您的数据库安全。3. 搭配数据复制服务DRS,可以实现本地数据库在线迁移上云。 本次华为云中国行系列活动,华为云数据库服务团队跟很多企业进行了广泛而深入的交流,了解到不少客户对云数据库抱有浓厚的兴趣。未来,华为云数据库服务团队会持续在数据安全、数据库性能等方面持续优化,为您提供更好的数据库服务,让您真正专注于业务开发,免除数据库的烦恼。 注:预计2017年12月23日(周六),华为云数据库服务团队将在深圳举办线下技术沙龙活动,敬请您持续关注和莅临参与。 【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
-
Mysql将数据存储在磁盘,为中小型的网络数据库,支持集群。Redis存储在内存,为支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。redis既可以用来做持久存储,也可以做缓存,大多只用来做 数据读取缓存、队列、锁、等等的使用。目前大多数公司的存储都是mysql + redis,mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能。
-
在MySQL5.7下采用多源复制方式,从5.6复制数据过来,会有问题吗?1、问题描述有位朋友想尝鲜5.7的多源复制,于是用MySQL 5.7版本作为slave,把MySQL5.6作为master,想要将数据进行汇总,发现此路不通。他在my.cnf中设置了2个选项,开启并发复制:slave_parallel_type = LOGICAL_CLOCKslave_parallel_workers = 4启动复制线程后,结果在错误日志中不断有类似下面的信息:Transaction is tagged with inconsistent logicaltimestamps: sequence_number (823267087) = last_committed(1301275374434324336)执行SHOW SLAVE STATUS\G 查看状态:*************************** 1. row ***************************Slave_IO_State: Waiting for master to send event…Last_Errno: 1756Last_Error: … The slave coordinator and worker threads are stopped, possiblyleaving data in inconsistent state. A restart should restore consistency autestuseratically,although using non-transactional storage for data or info tables or DDL queriescould lead to problems. In such cases you have to examine your data (seedocumentation for details).…Last_SQL_Errno: 1756Last_SQL_Error: … The slave coordinator and worker threads are stopped, possiblyleaving data in inconsistent state. A restart should restore consistency autestuseratically,although using non-transactional storage for data or info tables or DDL queriescould lead to problems. In such cases you have to examine your data (seedocumentation for details).…Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp: 160523 18:49:05…*************************** 2. row***************************Slave_IO_State: Waiting for master to send event…Last_Errno: 1756Last_Error: … The slave coordinator and worker threads are stopped, possiblyleaving data in inconsistent state. A restart should restore consistency autestuseratically,although using non-transactional storage for data or info tables or DDL queriescould lead to problems. In such cases you have to examine your data (seedocumentation for details).Skip_Counter: 0…Last_SQL_Errno: 1756Last_SQL_Error: … The slave coordinator and worker threads are stopped, possiblyleaving data in inconsistent state. A restart should restore consistency autestuseratically,although using non-transactional storage for data or info tables or DDL queriescould lead to problems. In such cases you have to examine your data (seedocumentation for details).…2、原因分析上面这些错误提示可以看到,主要原因是:slave端采用了基于 LOGICAL_CLOCK 类型的并行复制,但master端的binlog格式并不支持这种方式,所以slave端无法正确读取binlog并行apply。3、解决方案虽然仍旧可以采用MySQL5.7作为slave,但就无法开启基于LOGICAL_CLOCK 类型的并行复制了。需要改回传统模式就可以了:slave_parallel_type = DATABASE此外,在MySQL复制方案中,强烈建议不要让主从大版本不一样,很容易出现各种各样的问题。
-
1. 每个表最多1017个字段,每条记录最大65535个字节(如果是BLOB和TEXT字段,只占9~13个字节)。2. 表的大小可高达64T。 没有明确记录一个表能到多少行,但基本上可以用64T/64K=1G 1T=1024*1024*1024行,这是一个天文数字。3. 对数据库没有限制,这取决于操作系统目录个数的限制,EXT4文件系统没有目录个数限制,所以基本上理解没有限制。4. MySQL对数据库中的表没有限制,innodb允许高达40亿个表5. 根据经验,单个表不建议超过2千万条记录,否则建议采用分区表或者分库、分表。
-
一、基本原理它严格讲不是一种新的存储引擎(不像MyISAM、InnoDB那样),它是类似于oracle的database link。 简单讲:它本身不存储数据,是用来做数据链接的。 最典型的用法就是在A实例上有一个表,正常情况下是没有办法在B实例里访问到这个表的,如果想在B中访问A实例的这个表,就可以使用FEDERATED达到目的。 1. 默认官网版本已经支持federated引擎了,但是还没有打开 4781 2. 打开方法 在/etc/my.cnf加上 federated 3. 重启mysql4782 4. 创建表 4783 5. 实际例子 4784
-
一、MySQL5.6方面:当最高权限的用户密码root备忘记后,可以按如下方式来处理1. 关闭mysql进程2. 在/etc/my.cnf配置文件中加上 skip-grant-tables 3. 启动mysql进程4. 修改密码 47763. 将skip-grant-tables从配置文件中删除4. 重启mysql进程 二、MySQL5.7方面:如果还是按同样的方法,则会报错...4777 需要使用下面的方法:4778
-
这个公式只能计算出应用并发跑满的最极端情况下,mysql使用的内存的最大值。这个值的意义不大。我其实是想弄明白一个连接进来不执行任何操作(空连接),mysql或者操作系统会为这个连接分配多少内存,分配的内存包含哪些部分。 Memories for variablesread_buffer_size, sort_buffer_size, read_rnd_buffer_size, tmp_table_size areallocated as & when required.根据上边这段话的意思,建立一个空连接只需要分配 thread_stack+net_buffer_length这么多空间。我怎么去验证这个问题?从内存的使用方式MySQL 数据库的内存使用主要分为以下两类:线程独享内存 和 全局共享内存 Mysql Server Memory Usage= Sum of Global Buffers + (number of Connection * Per thread memory variables). 线程独享内存名称意义对应MySQL参数备注线程栈信息使用内存主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。thread_stack排序使用内存MySQL用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以sort_buffer_size参数对排序操作的性能影响绝对不可小视。sort_buffer_sizeJoin操作使用内存应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/indexjoin),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join的表进行 Join 操作,然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。join_buffer_size顺序读取数据缓冲区使用内存这部分内存主要用于当需要顺序读取数据的时候,如无发使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在read_buffer_size中,当 buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。read_buffer_size随机读取数据缓冲区使用内存和顺序读取相对应,当MySQL进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。总的来说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size参数所设置的内存缓冲区。read_rnd_buffer_size连接信息及返回客户端前结果集暂存使用内存这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当 MySQL 开始产生可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过net_buffer_size所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网络传输效率。不过,net_buffer_size参数所设置的仅仅只是该缓存区的初始化大小,MySQL 会根据实际需要自行申请更多的内存以满足需求,但最大不会超过max_allowed_packet 参数大小。net_buffer_length没有net_buffer_size参数批量**暂存使用内存当我们使用如 insert …values(…),(…),(…)… 的方式进行批量**的时候,MySQL会先将提交的数据放如一个缓存空间中,当该缓存空间被写满或者提交完所有数据之后,MySQL才会一次性将该缓存空间中的数据写入数据库并清空缓存。此外,当我们进行 LOAD DATA INFILE 操作来将文本文件中的数据 Load进数据库的时候,同样会使用到此缓冲区。bulk_insert_buffer_size临时表使用内存当我们进行一些特殊操作如需要使用临时表才能完成的Order By,Group By 等等,MySQL 可能需要使用到临时表。当我们的临时表较小(小于 tmp_table_size参数所设置的大小)的时候,MySQL 会将临时表创建成内存临时表,只有当 tmp_table_size所设置的大小无法装下整个临时表的时候,MySQL 才会将该表创建成 MyISAM 存储引擎的表存放在磁盘上。不过,当另一个系统参数max_heap_table_size 的大小还小于 tmp_table_size 的时候,MySQL 将使用max_heap_table_size 参数所设置大小作为最大的内存临时表大小,而忽略 tmp_table_size 所设置的值。而且tmp_table_size 参数从 MySQL 5.1.2 才开始有,之前一直使用 max_heap_table_size。tmp_table_size上面所列举的 MySQL 线程独享内存仅仅只是所有线程独享内存中的部分,并不是全部,选择的原则是可能对MySQL 的性能产生较大的影响,且可以通过系统参数进行调节。由于以上内存都是线程独享,极端情况下的内存总体使用量将是所有连接线程的总倍数。所以各位朋友在设置过程中一定要谨慎,切不可为了提升性能就盲目的增大各参数值,避免因为内存不够而产生Out Of Memory 异常或者是严重的 Swap 交换反而降低整体性能。 全局共享内存名称意义对应MySQL参数备注查询缓存查询缓存是 MySQL 比较独特的一个缓存区域,用来缓存特定Query 的结果集(Result Set)信息,且共享给所有客户端。通过对 Query 语句进行特定的 Hash 计算之后与结果集对应存放在Query Cache 中,以提高完全相同的 Query 语句的相应速度。当我们打开 MySQL 的 Query Cache 之后,MySQL接收到每一个 SELECT 类型的 Query 之后都会首先通过固定的 Hash 算法得到该 Query 的 Hash 值,然后到 QueryCache 中查找是否有对应的 Query Cache。如果有,则直接将 Cache的结果集返回给客户端。如果没有,再进行后续操作,得到对应的结果集之后将该结果集缓存到 Query Cache中,再返回给客户端。当任何一个表的数据发生任何变化之后,与该表相关的所有 Query Cache 全部会失效,所以 Query Cache对变更比较频繁的表并不是非常适用,但对那些变更较少的表是非常合适的,可以极大程度的提高查询效率,如那些静态资源表,配置表等等。为了尽可能高效的利用 Query Cache,MySQL 针对 Query Cache 设计了多个 query_cache_type 值和两个 QueryHint:SQL_CACHE 和 SQL_NO_CACHE。当 query_cache_type 设置为0(或者 OFF)的时候不使用Query Cache,当设置为1(或者 ON)的时候,当且仅当 Query 中使用了 SQL_NO_CACHE 的时候 MySQL 会忽略Query Cache,当 query_cache_type 设置为2(或者DEMAND)的时候,当且仅当Query 中使用了SQL_CACHE 提示之后,MySQL 才会针对该 Query 使用 Query Cache。可以通过 query_cache_size来设置可以使用的最大内存空间。query_cache_size连接线程缓存连接线程是 MySQL为了提高创建连接线程的效率,将部分空闲的连接线程保持在一个缓存区以备新进连接请求的时候使用,这尤其对那些使用短连接的应用程序来说可以极大的提高创建连接的效率。当我们通过 thread_cache_size设置了连接线程缓存池可以缓存的连接线程的大小之后,可以通过(Connections - Threads_created) /Connections * 100% 计算出连接线程缓存的命中率。注意,这里设置的是可以缓存的连接线程的数目,而不是内存空间的大小。thread_cache_size注意,这里设置的是可以缓存的连接线程的数目,而不是内存空间的大小。表缓存表缓存区主要用来缓存表文件的文件句柄信息,在MySQL5.1.3之前的版本通过 table_cache 参数设置,但从MySQL5.1.3开始改为 table_open_cache来设置其大小。当我们的客户端程序提交 Query 给 MySQL 的时候,MySQL 需要对 Query所涉及到的每一个表都取得一个表文件句柄信息,如果没有 Table Cache,那么 MySQL就不得不频繁的进行打开关闭文件操作,无疑会对系统性能产生一定的影响,Table Cache 正是为了解决这一问题而产生的。在有了 TableCache 之后,MySQL 每次需要获取某个表文件的句柄信息的时候,首先会到 Table Cache中查找是否存在空闲状态的表文件句柄。如果有,则取出直接使用,没有的话就只能进行打开文件操作获得文件句柄信息。在使用完之后,MySQL会将该文件句柄信息再放回 Table Cache池中,以供其他线程使用。注意,这里设置的是可以缓存的表文件句柄信息的数目,而不是内存空间的大小table_open_cache表定义信息缓存表定义信息缓存是从MySQL5.1.3 版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的 MySQL中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL 提供了 table_definition_cache参数给我们设置可以缓存的表的数量。在 MySQL5.1.25 之前的版本中,默认值为128,从 MySQL5.1.25版本开始,则将默认值调整为 256 了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。table_definition_cache注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。二进制日志缓冲区二进制日志缓冲区主要用来缓存由于各种数据变更操做所产生的Binary Log 信息。为了提高系统的性能,MySQL 并不是每次都是将二进制日志直接写入 Log File,而是先将信息写入Binlog Buffer 中,当满足某些特定的条件(如 sync_binlog参数设置)之后再一次写入 Log File 中。我们可以通过binlog_cache_size 来设置其可以使用的内存大小,同时通过 max_binlog_cache_size限制其最大大小(当单个事务过大的时候 MySQL 会申请更多的内存)。当所需内存大于 max_binlog_cache_size参数设置的时候,MySQL 会报错:“Multi-statement transaction required more than‘max_binlog_cache_size’ bytes of storage”。binlog_cache_sizeMyISAM索引缓存MyISAM 索引缓存将 MyISAM 表的索引信息缓存在内存中,以提高其访问性能。这个缓存可以说是影响 MyISAM 存储引擎性能的最重要因素之一了,通过 key_buffere_size 设置可以使用的最大内存空间key_buffer_sizeInnoDB 日志缓冲区这是 InnoDB存储引擎的事务日志所使用的缓冲区。类似于 Binlog Buffer,InnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer 中,当满足 innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。可以通过 innodb_log_buffer_size参数设置其可以使用的最大内存空间innodb_log_buffer_size针对redo logInnoDB 数据和索引缓存InnoDB BufferPool 对 InnoDB 存储引擎的作用类似于 Key Buffer Cache 对 MyISAM 存储引擎的影响,主要的不同在于InnoDB Buffer Pool 不仅仅缓存索引数据,还会缓存表的数据,而且完全按照数据文件中的数据快结构信息来缓存,这一点和Oracle SGA 中的 database buffer cache 非常类似。所以,InnoDB Buffer Pool 对 InnoDB存储引擎的性能影响之大就可想而知了。可以通过 (Innodb_buffer_pool_read_requests -Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%计算得到 InnoDB Buffer Pool 的命中率。innodb_buffer_pool_sizeInnoDB 字典信息缓存InnoDB字典信息缓存主要用来存放 InnoDB 存储引擎的字典信息以及一些 internal 的共享数据结构信息。所以其大小也与系统中所使用的InnoDB 存储引擎表的数量有较大关系。不过,如果我们通过 innodb_additional_mem_pool_size参数所设置的内存大小不够,InnoDB 会自动申请更多的内存,并在 MySQL 的 Error Log 中记录警告信息。innodb_additional_mem_pool_size这里所列举的各种共享内存,是我个人认为对 MySQL 性能有较大影响的集中主要的共享内存。实际上,除了这些共享内存之外,MySQL还存在很多其他的共享内存信息,如当同时请求连接过多的时候用来存放连接请求信息的back_log队列等。
-
本帖最后由 tony 于 2017-11-14 20:20 编辑我这里做了一个简单的实验。过程如下:1、 首先调整好参数set global max_connections=100000;set globalsort_buffer_size=104857600;set globaljoin_buffer_size=104857600;set globalread_buffer_size=104857600;set globalread_rnd_buffer_size=104857600;set global net_buffer_length=1048576; (除了这个最大值为1048576外,剩下的都取为100M)set globalbulk_insert_buffer_size=104857600;set globaltmp_table_size=104857600;2、然后模拟N多个空连接#!/bin/shi=0while true;domysql -uroot -p**D -A -NBe"select sleep(1000000)" & //这里只能模拟执行一个select sleep(1000000),如果什么都不做貌似不好模拟出场景,基本每秒进行一个连接sleep 1((i= $i + 1))done3、运行一个内存监控小程序#!/bin/shwhile true;dofree -k >> mem.txtsleep 1done4 、最后的结果大概是这样的[root@dtvlan15 software]# head -20mem.txt total used free shared buff/cache availableMem: 7471604 1259920 5657644 8908 554040 5933408Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1260660 5656900 8908 554044 5932668Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1260800 5656760 8908 554044 5932528Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1261220 5656340 8908 554044 5932108Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1261948 5655612 8908 554044 5931380Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1262600 5654960 8908 554044 5930728Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1265540 5652012 8908 554052 5927784…[root@dtvlan15 software]# tail -20mem.txt --大概进行了800多个连接的时候的内存使用情况Mem: 7471604 1942528 4948312 8908 580764 5225908Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1943420 4947412 8908 580772 5225008Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1943912 4946860 8908 580832 5224456Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1946184 4944556 8908 580864 5222156Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1946124 4944456 8908 581024 5222064Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1946900 4943672 8908 581032 5221284Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 7471604 1947612 4942944 8908 581048 5220556Swap: 2097148 0 2097148 5、大概结论貌似一个空连接仅仅分配几百K~1M左右的样子(网上有人说256K)。即使参数设置很大。
-
sync_binlog sync_binlog是MySQL的binlog写入方式。它可以设置0以上的值。1. sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。2. 当sync_binlog =N (N>0) ,MySQL 在每写 N次二进制日志binarylog时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。很明显,最安全的设置是1,即写一个binlog,同步一次。innodb_flush_log_at_trx_commit和sync_binlog两个参数,在均被设置成1的时候,被称作双1模式。这个模式下,MySQL的数据可靠性是最好的。innodb_support_xa 前面几个参数已经极大的保证了MySQL不丢数据。但还是可能出现一种情况。那就是,当事物提交时,MySQL挂掉。这个时候,binlog已经落盘,而redo中事务未提交。就会回滚掉事物。而binlog是不能回滚的,于是就出现binlog有这个操作,而innodb中没有。如果有主备复制的话,就会出现主备不一致。 究其原因:写redo log和写binlog,正常情况下不是原子操作的。是两个阶段,所以要想保持一致,就必须将它作为分布式事务来考虑,这就是innodb_support_xa参数的作用。innodb_support_xa在设为ON时,会使用二阶段提交协议来保证binlog和innodb的一致
-
RPM包安装时会在数据目录下生成很多证书文件,比如:ca-key.pemca.pemclient-cert.pemclient-key.pemprivate_key.pempublic_key.pemserver-cert.pemserver-key.pem 这些文件的作用如下:ca.pem : 作为--ssl-ca参数值,在服务器和客户端,CA证书,如果使用,服务器端和客户端必须相同server-cert.pem, server-key.pem : 在服务器端分别作为--ssl-cert和--ssl-key两个参数的值。client-cert.pem, client-key.pem:在客户端分别作为--ssl-cert和--ssl-key两个参数的值。 服务器端:--ssl-ca: 表示CA证书--ssl-cert: 表示服务器端公钥证书--ssl-key: 表示服务器端私钥 客户端:--ssl-ca: 表示CA证书--ssl-cert: 表示客户端公钥证书--ssl-key: 表示客户端私钥 服务器端要如下配置:[mysqld]ssl-ca=ca.pemssl-cert=server-cert.pemssl-key=server-key.pem 客户端连接的时候需要:mysql –ssl-ca=ca.pem –ssl-cert=client-cert.pem --ssl-key=client-key.pem 查看server端是否支持mysql> show variables like '%ssl%';+---------------+-----------------+| Variable_name | Value |+---------------+-----------------+| have_openssl | YES || have_ssl | YES || ssl_ca | ca.pem || ssl_capath | || ssl_cert | server-cert.pem || ssl_cipher | || ssl_crl | || ssl_crlpath | || ssl_key |server-key.pem |+---------------+-----------------+9 rows in set (0.00 sec) 我们从客户端连接数据库mysql -h100.100.184.152 -P3306 --ssl-ca=ca.pem --ssl-cert=client-cert.pem--ssl-key=client-key.pem -uroot –p 如果我们要求一个账号必须使用SSL来连接数据库,需要下面这样创建账号mysql> create user testuser@'10.21.215.86' identified by '**D';Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'10.21.215.86' REQUIRE SSL;Query OK, 0 rows affected, 1 warning (0.00 sec) 这样必须用证书连接[root@SZX1000165720 software]# mysql -h100.100.184.152 -P3306--ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -utestuser-pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 31Server version: 5.7.16-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rightsreserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Type 'help;' or '\h' for help. Type '\c' to clear the current inputstatement. mysql> SHOW STATUS LIKE 'Ssl_cipher';+---------------+--------------------+| Variable_name | Value |+---------------+--------------------+| Ssl_cipher | DHE-RSA-AES256-SHA|+---------------+--------------------+1 row in set (0.00 sec) mysql> 否则就会报错:[root@SZX1000165720 software]# mysql -h100.100.184.152 -P3306 -utestuser-pEnter password: ERROR 1045 (28000): Access denied for user 'testuser'@'10.21.215.86'(using password: YES) 二、自己来发放证书这都是默认的证书和文件,我们来自己生成新的看看,方法如下:# Create clean environmentshell> rm -rf newcertsshell> mkdir newcerts && cd newcerts # Create CA certificateshell> openssl genrsa 2048 > ca-key.pemshell> openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -outca.pemYou are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or aDN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:GuangdongLocality Name (eg, city) [Default City]:ShenzhenOrganization Name (eg, company) [Default Company Ltd]:HuaweiOrganizational Unit Name (eg, section) []:CloudCommon Name (eg, your name or your server's hostname) []:caEmail Address []:luozhaode@huawei.com # Create server certificate, remove passphrase, and sign it# server-cert.pem = public key, server-key.pem = private keyshell> openssl req -newkey rsa:2048 -days 3600 -nodes -keyoutserver-key.pem -out server-req.pemGenerating a 2048 bit RSA private key.....+++...................................+++writing new private key to 'server-key.pem'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or aDN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:GuangdongLocality Name (eg, city) [Default City]:ShenzhenOrganization Name (eg, company) [Default Company Ltd]:HuaweiOrganizational Unit Name (eg, section) []:CloudCommon Name (eg, your name or your server's hostname) []:masterEmail Address []:luozhaode@huawei.com Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []: shell> openssl rsa -in server-key.pem -out server-key.pemshell> openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem-CAkey ca-key.pem -set_serial 01 -out server-cert.pem # Create client certificate, remove passphrase, and sign it# client-cert.pem = public key, client-key.pem = private keyshell> openssl req -newkey rsa:2048 -days 3600 -nodes -keyoutclient-key.pem -out client-req.pem Generating a 2048 bit RSA private key.+++...............................................................+++writing new private key to 'client-key.pem'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or aDN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:GuangdongLocality Name (eg, city) [Default City]:ShenzhenOrganization Name (eg, company) [Default Company Ltd]:HuaweiOrganizational Unit Name (eg, section) []:CloudCommon Name (eg, your name or your server's hostname) []:slaveEmail Address []:luozhaode@huawei.com Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []: shell> openssl rsa -in client-key.pem -out client-key.pemshell> openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem-CAkey ca-key.pem -set_serial 01 -out client-cert.pem 最后可以用下面的命令来验证:[root@SZX1000186519 newcerts]# openssl verify -CAfile ca.pemserver-cert.pem client-cert.pemserver-cert.pem: OKclient-cert.pem: OK 在主库的参数文件中:[mysqld]ssl-ca=/var/software/newcerts/ca.pemssl-cert=/var/software/newcerts/server-cert.pemssl-key=/var/software/newcerts/server-key.pem 然后在主库上创建用户:mysql> create user testuser@'100.100.185.169' identified by '**D'REQUIRE X509;Query OK, 0 rows affected (0.00 sec) mysql> grant all on *.* TO 'testuser'@'100.100.185.169';Query OK, 0 rows affected (0.01 sec) mysql> flush privileges;Query OK, 0 rows affected (0.01 sec) 这个时候使用系统自带的证书是不行的,会报错。[root@SZX1000186273 mysql]# mysql -h100.100.184.152 -P3306 -utestuser -p--ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pemEnter password: ERROR 2026 (HY000): SSL connection error: ASN: bad other signatureconfirmation 为此我们需要把主库上生成的证书信息拷贝过来,然后[root@SZX1000186273 newcerts]# mysql -h100.100.184.152 -P3306 -utestuser-p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pemEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 12Server version: 5.7.16-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rightsreserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Type 'help;' or '\h' for help. Type '\c' to clear the current inputstatement. mysql> SHOW STATUS LIKE 'Ssl_cipher';+---------------+--------------------+| Variable_name | Value |+---------------+--------------------+| Ssl_cipher | DHE-RSA-AES256-SHA|+---------------+--------------------+1 row in set (0.01 sec) mysql> 我们在从库中进行如下的配置:CHANGE MASTER TO MASTER_HOST='100.100.184.152', MASTER_PORT=3306, MASTER_USER='testuser', MASTER_PASSWORD='**D', MASTER_LOG_FILE='mysql-bin.000034', MASTER_LOG_POS=1408, MASTER_AUTO_POSITION=0, MASTER_SSL=1, MASTER_SSL_CA='/var/software/newcerts/ca.pem', MASTER_SSL_CAPATH='/var/software/newcerts', MASTER_SSL_CERT='/var/software/newcerts/client-cert.pem', MASTER_SSL_KEY='/var/software/newcerts/client-key.pem'; 启动就可以了。如果我们将证书目录移动并且再停止复制线程,则会报错。 mysql> show slave status\G*************************** 1. row *************************** Slave_IO_State:Waiting for master to send event Master_Host:100.100.184.152 Master_User: testuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File:mysql-bin.000035 Read_Master_Log_Pos: 2459 Relay_Log_File:relay-log.000004 Relay_Log_Pos: 320 Relay_Master_Log_File:mysql-bin.000035 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 2459 Relay_Log_Space: 3039 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File:/var/software/newcerts/ca.pem Master_SSL_CA_Path:/var/software/newcerts Master_SSL_Cert:/var/software/newcerts/client-cert.pem Master_SSL_Cipher: Master_SSL_Key:/var/software/newcerts/client-key.pem Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1024 Master_UUID:75f1a32f-a4e2-11e6-8b15-286ed48**e Master_Info_File:/var/db/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slavehas read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
-
首先有一个系统变量MAX_USER_CONNECTIONSmysql> show variables like 'MAX_USER_CONNECTIONS';+----------------------+-------+| Variable_name | Value |+----------------------+-------+| max_user_connections | 0 |+----------------------+-------+1 row in set (0.01 sec) The maximum number of simultaneous connectionspermitted to any given MySQL user account. Avalue of 0 (the default) means “no limit.” 允许同一账号同时连接的最大数,如果为0则没有限制。如果用户对这个MAX_USER_CONNECTIONS设置了资源限制,那么session值就是这个限制值。否则,session就设置这个全局量。• Otherwise, the sessionmax_user_connections value is set to the global value. 实验如下:mysql> set global max_user_connections=5;Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'max_user_connections';+----------------------+-------+| Variable_name | Value |+----------------------+-------+| max_user_connections | 5 |+----------------------+-------+ 1 row in set (0.00 sec) 创建一个账号:Create user tom@’localhost’ identified by ‘Huawei@123’;Grant all on *.* to tom@’localhost’; 我们开启5个session, 发现第六个时报错:[root@SZX1000165720 ~]# mysql -utom -pEnter password: ERROR 1203 (42000): User tom already has more than 'max_user_connections'active connections 我们来用下面的语句设置用户资源限制:mysql> GRANT ALL ON *.* TO 'tom'@'localhost' WITH MAX_QUERIES_PER_HOUR20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'max_user_connections';+----------------------+-------+| Variable_name | Value |+----------------------+-------+| max_user_connections | 5 |+----------------------+-------+1 row in set (0.00 sec) [root@SZX1000165720 ~]# mysql -utom -pEnter password: ERROR 1226 (42000): User 'tom' has exceeded the 'max_user_connections'resource (current value: 2) MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_QUERIES_PER_HOUR参数的意义是一个小时区间内,某个账号所运行执行的查询次数,如果使用了query cache,则不计算在内。如果为0,则代表对这个账号没有限制。 MAX_CONNECTIONS_PER_HOUR参数的意义是一个小时区间内,某个账号连接数据的次数。如果为0,则代表对这个账号没有限制。 当我运行mysql> select * from INNODB_FT_INDEX_TABLE;ERROR 1226 (42000): User 'tom' has exceeded the 'max_questions' resource(current value: 20) 修改某个用户的资源限制有两种办法:1. GRANT USAGE ON *.* TO 'zabbix'@'localhost' WITH MAX_QUERIES_PER_HOUR100; (对于不存在的账户会报错)2. 直接修改mysq.user表的字段值
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签