1. Upgrading to MySQL 5.7, focusing on temporal types

在MySQL 5.6.4中,对TIME, TIMESTAMP and DATETIME三种时间类型进行了扩充,支持了微秒,并且DATETIME的存储由之前的8个字节缩小到5个字节。

MySQL 5.6.4在Server层新增三种时间类型MYSQL_TYPE_TIME2,MYSQL_TYPE_DATETIME2,MYSQL_TYPE_TIMESTAMP2,并在InnoDB层以二进制的格式存储,用这种方式来实现时间类型支持小数精度并优化存储节省空间。

如果从MySQL 5.5升级到5.6,使用mysql_upgrade,mysql_upgrade并不会显示的将之前的类型转换成新类型,只是新建的表会使用新类型。

但如果是升级到5.7,则mysql_upgrade会将旧类型转换为新类型,而这可能导致升级的过程比较漫长。

对于上述情况,如果避免呢?

1. mysql_upgrade支持upgrade-system-tables选项,在升级时可指该参数,只升级系统表,而不升级普通表

2. 升级完毕后,再使用alter table或者pt-online-schema-schange修改表的数据类型。

可通过以下命令查看升级完毕后,各表中上述三个字段的新旧情况。

SELECT CASE isc.mtype
WHEN '' THEN 'OLD'
WHEN '' THEN 'NEW'
END FORMAT,
t.schema_name,
t.table_name
FROM information_schema.tables AS t
INNER JOIN information_schema.columns AS c ON c.table_schema = t.table_schema
AND c.table_name = t.table_name
LEFT OUTER JOIN information_schema.innodb_sys_tables AS ist ON ist.name = concat(t.table_schema,'/',t.table_name)
LEFT OUTER JOIN information_schema.innodb_sys_columns AS isc ON isc.table_id = ist.table_id
AND isc.name = c.column_name
WHERE c.column_type IN ('time','timestamp','datetime')
AND t.table_schema NOT IN ('mysql','information_schema','performance_schema')
AND t.table_type = 'base table'
AND (t.engine = 'innodb');

注意:5.6中t.shema_name应为t.TABLE_SCHEMA。

具体可参考:https://www.percona.com/blog/2016/04/27/upgrading-to-mysql-5-7-focusing-on-temporal-types/

2. Best Practices for Configuring Optimal MySQL Memory Usage

1> The first rule of configuring MySQL memory usage is you never want your MySQL to cause the operating system to swap.Even minor swapping activity can dramatically reduce MySQL performance.

并不是有了swap就一定是坏事,有可能这些swap是在MySQL启动之前产生的。重点需要关注的是MySQL运行过程中的SWAP情况。

这个可以很容易根据vmstat命令中的si和so列看出来。

2> MySQL的内存分配很复杂,There are global buffers, per-connection buffers (which depend on the workload), and some uncontrolled memory allocations (i.e., inside Stored Procedures), all contributing to difficulties in computing how much memory MySQL will really use for your workload.

比较合理的是查看MySQL使用的virtual memory size (VSZ),这个可通过top命令或者ps aux | grep mysqld查看,单位是KB。

$ ps aux |grep mysqld
bdp 16569 0.0 0.0 103240 868 pts/0 S+ 14:35 0:00 grep mysqld
bdp 25883 0.0 0.0 106220 1360 ? S Mar25 0:00 /bin/sh ./bin/mysqld_safe
bdp 26716 12.7 2.4 16884956 9652760 ? Sl Mar25 7684:17 /home/bdp/mysql/bin/mysqld --basedir=/home/bdp/mysql/ --datadir=/home/bdp/mysql/data/ --plugin-dir=/home/bdp/mysql//lib/plugin --log-error=/home/bdp/mysql/logs/mysqld.log --pid-file=/home/bdp/mysql/run/mysqld/mysqld.pid --socket=/home/bdp/mysql/tmp/mysql.sock
-bash-4.1$ bash

上图中,VSZ16884956,大概16.1G

VSZ可能会随着时间发生变化,所以要及时监控这一项,Don’t allow the mysqld process VSZ exceed 90% of the system memory,如果服务器上还运行了其它的进程,阀值更小,一旦超过这个阀值,要及时发出告警(这点,可通过脚本实现)。

3> 在大多数情况下,你不能将90%的内存分配给MySQL。有以下几点需要考虑:

1. 有其它的重要进程运行在同一服务器上,无论是长期的还是周期性的,或者批量任务。

2. 对于Innodb,推荐innodb_flush_method=O_DIRECT,这样就不会使用Operating System File Cache。但是对于MyISAM或者TokuDB,需要操作系统缓存来缓存数据。

3. 对于MyISAM on disk temporary tables, sort files, some other temporary files,操作系统缓存还是必需的。

4> 对于一个16G内存的服务器,innodb_buffer_pool_size分配多少比较合适呢?

Let’s do some math for a specific example. Assume you have a system (physical or virtual) with 16GB of memory. We are only running MySQL on this system, with an InnoDB storage engine and use innodb_flush_method=O_DIRECT, so we can allocate 90% (or 14.4GB) of memory to MySQL. For our workload, we assume connection handling and other MySQL connection-based overhead will take up 1GB (leaving 13.4GB). 0.4GB is likely to be consumed by various other global buffers (innodb_log_buffer_size, Table Caches, other miscellaneous needs, etc.), which now leaves 13GB. Considering the 5-7% overhead that the InnodB Buffer Pool has, a sensible setting is innodb_buffer_pool_size=12G – what we very commonly see working well for systems with 16GB of memory.

5> 配置完MySQL内存,下面来看看操作系统层面的配置。

主要涉及以下几个方面:

1. SWAP需要开启么?

需要开启,争取最小4G,但不能超过服务器内存的25%。有以下两点原因:

1> 操作系统可以将内存中没有使用的部分通过swap方式释放出去,而不是强制它们放到内存中。

2> 如果你的MySQL配置出现错误,或者某些进程的内存消耗超过预期,会导致MySQL因内存溢出(OOM)直接被kill掉,如果有swap,最多是性能下降。

可通过设置echo 1 >  /proc/sys/vm/swappiness降低系统对swap的使用,从而避免不必要的swap对性能造成的影响。这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。

2. 配置Out Of Memory killer

echo '-800' > /proc/$(pidof mysqld)/oom_score_adj

通过设置此值,可使Linux内核优先kill其它进程而不是MySQL。

3. 在多核服务器中,关于NUMA的设置。

在5.7.9中,引入了一个新的系统参数,innodb_numa_interleave,将其设置为1,Enables the NUMA interleave memory policy for allocation of the InnoDB buffer pool

在之前,可通过numactl --interleave=all进行设置。

具体可参考:https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

Percona博客学习总结的更多相关文章

  1. FPGA一个博客学习

    FPGA一个博客学习 http://bbs.ednchina.com/BLOG_PERSONALCAT_100185_2001619.HTM

  2. django参考博客学习

    网上发现其他人的一个django系列博客,和我学的一样是黑马的,写的挺不错的,转载学习一下 https://blog.csdn.net/u014745194/article/category/6989 ...

  3. python+selenium之悠悠博客学习笔记

    1 Python之自动化测试框架selenium学习 offical website 悠悠之selenium浅谈·博客园 悠悠软件测试系列 1.1 基础环境准备 1.1.1 python包下载工具的安 ...

  4. EF6 Code First 博客学习记录

    学习一下ef6的用法 这个学习过程时按照微软官网的流程模拟了一下 就按照下面的顺序来写吧 1.连接数据库  自动生成数据库 2.数据库迁移 3.地理位置以及同步/异步处理(空了再补) 4.完全自动迁移 ...

  5. 做个开源博客学习Vite2 + Vue3 (一)搭建项目

    前言 不会 webpack,遇到报错就一头雾水,完全不知道怎么办,而且体积还大速度还慢. 所以尤雨溪做了 vite 后就很向往,只是知道自己水平有限还是等大佬先趟趟坑,等差不多了在跳. 现在vite2 ...

  6. 用hexo书写github.io博客 学习心得 教程

    很久没更新文章了,除了工作忙之外,可能就是自己懒惰了. 最近混迹与github,发现git上写博客也是个很不错的平台. 推荐使用 hexo 模版来书写,毕竟我们重点是写文章,而不是管理,所以有神奇何妨 ...

  7. android fragment 博客 学习记录

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  8. 【转】android fragment 博客 学习

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...

  9. market1501的学习,跟着苏同学的博客学习

    先看看官方文档:然后附上苏的博客链接http://bigbrothersue.com/index.php/2017/12/20/person-re-id/ The Market-1501 datase ...

随机推荐

  1. 无法连接虚拟设别 ide1:0.

    安装虚拟机时出现提示:无法连接虚拟设备 ide1:0,因为主机上没有相应的设备.您要在每次开启此虚拟机时都尝试连接此虚拟设备吗? ide1:0一般是虚拟机的光驱,配置选项是“使用物理驱动器”,而宿主机 ...

  2. iOS 面试总结 二

    1.用三种方法生成内容为数字 1,2 ,3 的可变数组.(使用Objective-C,尽量一行代码实现) //方法一 NSMutableArray *arr1 = [[NSMutableArray a ...

  3. ubuntu14.04 安装 hadoop2.4.0

    转载:ubuntu搭建hadoop-Ver2.6.0完全分布式环境笔记 自己在搭建hadoop平台时,碰到一些困难,按照该博文解决了问题,转载一下,作为记录. 2 先决条件 确保在你集群中的每个节点上 ...

  4. dfs判断连通图(无向)

    在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...

  5. ThinkPHP5 与 ThinkPHP3.* 之间的使用差异

    因为研究TP5时间不是很长,暂时先列以下几处差异: 1.过去的单字母函数已完全被替换掉,如下: S=>cache,C=>config,M/D=>model,U=>url,I=& ...

  6. SQL Server2000清除数据库日志

    sqlserver2000压缩日志 可以将jb51.ldf文件变得很小,方便备份数据库等,在sqlserver查询分析器中执行即可.复制代码 代码如下: DUMP TRANSACTION [jb51] ...

  7. 【四】搭建Markdown的编辑器

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  8. poj2718-Smallest Difference(枚举全排列)

    一,题意: 给出最多10个数字,将它们划分为两个整数,求差值最小的值(除非只有一位数,否则不允许出现先导0) 很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2.二,思路: 利用nex ...

  9. 梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访

    梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访    “成功了!”,随着一句欢呼声在阿里巴巴西溪园区传出,Cydia的图标出现在一部iOS9.3.4的iPhone6上并成功运行 ...

  10. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...