使用
超过十年行业经验,技术领先,服务至上的经营模式,全靠网络和口碑获得客户,为自己降低成本,也就是为客户降低成本。到目前业务范围包括了:做网站、网站建设,成都网站推广,成都网站优化,整体网络托管,微信平台小程序开发,微信开发,重庆App定制开发,同时也可以让客户的网站和网络营销和我们一样获得订单和生意!
unbuffered
cursor
可以避免内存问题。
cursor
默认使用
buffered
模式。这种模式会把所有结果集返回并载入内存。如果结果集很大的话,内存会爆。
unbuffered
cursor
是每次只将下一行结果返回,内存占用很小。不过这种模式缺点很多,所以没有作为默认的模式。
以MySQL 8.0 来说,通过查看 8.0 的官方文档得知,8.0 的临时表空间分为会话临时表空间和全局临时表空间,会话临时表空间存储用户创建的临时表和当 InnoDB 配置为磁盘内部临时表的存储引擎时由优化器创建的内部临时表,当会话断开连接时,其临时表空间将被截断并释放回池中;也就是说,在 8.0 中有一个专门的会话临时表空间,当会话被杀掉后,可以回收磁盘空间;而原来的 ibtmp1 是现在的全局临时表空间,存放的是对用户创建的临时表进行更改的回滚段,在 5.7 中 ibtmp1 存放的是用户创建的临时表和磁盘内部临时表;
也就是在 8.0 和 5.7 中 ibtmp1 的用途发生了变化,5.7 版本临时表的数据存放在 ibtmp1 中,在 8.0 版本中临时表的数据存放在会话临时表空间,如果临时表发生更改,更改的 undo 数据存放在 ibtmp1 中;
实验验证:将之前的查询结果保存成临时表,对应会话是 45 号,通过查看对应字典表,可知 45 号会话使用了 temp_8.ibt 这个表空间,通过把查询保存成临时表,可以用到会话临时表空间,如下图:
下一步杀掉 45 号会话,发现 temp_8.ibt 空间释放了,变为了初始大小,状态为非活动的,证明在 mysql8.0 中可以通过杀掉会话来释放临时表空间。
总结:在 mysql5.7 时,杀掉会话,临时表会释放,但是仅仅是在 ibtmp 文件里标记一下,空间是不会释放回操作系统的。如果要释放空间,需要重启数据库;在 mysql8.0 中可以通过杀掉会话来释放临时表空间。
操作系统:CentOS 6.2
现象:MySQL无法启动
查找问题发现:存放mysql数据分区100%
[root@jinniu-test3 mysql]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda2 49G 49G 20K 100% /
tmpfs 933M 0 933M 0% /dev/shm
/dev/sda1 194M 31M 153M 17% /boot
/dev/sda5 219G 701M 207G 1% /opt
检查/etc/my.cnf,数据文件默认存放于/var/lib/mysql下
确认此文件夹确实过大
解决方案:转移存放目录,修改my.cnf或者软连接回来
[root@-_- ~]# cp -Rp /var/lib/mysql /opt/ --带权限拷贝整个目录
修改/etc/my.cnf配置datadir=/opt/mysql指向新位置
重启mysql发现无法启动
[root@-_- ~]# service mysqld start
MySQL Daemon failed to start.
正在启动 mysqld: [失败]
检查/var/log/mysqld.log文件最后
[root@-_- ~]# tail -20 /var/log/mysqld.log
...
130301 11:52:05 [Warning] Can't create test file /opt/mysql/-_-.lower-test
130301 11:52:05 [Warning] Can't create test file /opt/mysql/-_-.lower-test
...
网络搜索问题得知是这台机器启用SElinux 安全策略引起的
使用命令可以解决
[root@-_- ~]# chcon -R -t mysqld_db_t /opt/mysql
实在不行,禁用SElinux
执行:setenforce 0