扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。 MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表空间,校验速度就非常缓慢。另外一个发现,MySQL 8 下正常启用时居然也会进行表空间校验,而故障恢复时则会额外再进行一次表空间校验,等于校验了 2 遍。不过 MySQL 8.0 里多了一个特性,即表数量超过 5W 时,会启用多线程扫描,加快表空间校验过程。
成都创新互联是一家专业提供冠县企业网站建设,专注与成都网站建设、成都网站制作、H5高端网站建设、小程序制作等业务。10年已为冠县众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。
如何跳过校验MySQL 5.7 下有方法可以跳过崩溃恢复时的表空间校验过程嘛?查阅了资料,方法主要有两种:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳过表空间校验。实际测试的时候设置 innodb_force_recovery =1,也就是强制恢复跳过坏页,就可以跳过校验,然后重启就是正常启动了。通过这种临时方式可以避免崩溃恢复后非常耗时的表空间校验过程,快速启动 MySQL,个人目前暂时未发现有什么隐患。2. 使用共享表空间替代独立表空间这样就不需要打开 N 个 ibd 文件了,只需要打开一个 ibdata 文件即可,大大节省了校验时间。自从听了姜老师讲过使用共享表空间替代独立表空间解决 drop 大表时性能抖动的原理后,感觉共享表空间在很多业务环境下,反而更有优势。
临时冒出另外一种解决想法,即用 GDB 调试崩溃恢复,通过临时修改 validate 变量值让 MySQL 跳过表空间验证过程,然后让 MySQL 正常关闭,重新启动就可以正常启动了。但是实际测试发现,如果以 debug 模式运行,确实可以临时修改 validate 变量,跳过表空间验证过程,但是 debug 模式下代码运行效率大打折扣,反而耗时更长。而以非 debug 模式运行,则无法修改 validate 变量,想法破灭。
数据库在删除记录之后,空间是不会减少的,只有在手工清理之后才可以减少,但是对于大数据量的时候建议考虑好清理数据库所花费的代价,时间很比较长,且很有可能前端服务无法使用
命令为OPTIMIZE TABLE `tableName`;
我也没用过存储过程,我猜测是不是变量前面要加@,例如你试试看这样写:
create table @tname as select * from m_admin;
mySQL是一个比较成熟的中小型数据库,用户非常广泛,其中也不乏知名的大公司。当然,每种东西都会有缺点,mysql也不例外,但是把它说成是垃圾,这一点无论是从技术上还是从感情上恐怕都是说不通的,更何况您的理由竟然是“phpmyadmin又难用界面难看死了,还有中文乱码”,不过这也正好说明了您对于mySQL的不了解(确切地说应该是“mySQL的文盲”,因为以上两个问题都正是您对于mySQL的无知才出现的,就算您说的对——它长得难看,那也可以换吗,mySQL的管理工具多得是了),我想通过您的进一步学习,您应该会喜欢上它的。
解决方法一:
打开“服务”项目,选择mysql服务,在右键中选择其“恢复”选项,它负责服务失败时计算机的反应。每一次失败时,你可以选择(1)不操作;(2)重新启动服务;(3)运行一个程序;(4)重启服务器。您可以在第一次和第二次失败时选择重新启动服务,第三次失败就重启服务器,这样可以在无人值守的情况下达到自稳。但遗憾的是windows的这项内置服务工作时并不尽如人意。
解决方法二:
定期优化MySQL,这可以通过Mysql administrator来执行,也可以使用mysql的维护工具mysqlcheck,使用方法为:进入Mysql的Bin目录:C:\Program Files\MySQL\MySQL Server 4.1\bin 运行:mysqlcheck -A -o -r -uroot -p123456(注意,将123456改成你自己的root用户密码, 如无请留空 ),有时可以起到一定的作用。
解决方法三:
建立一个php+mysql的简单网站,在服务器监控王的网站监视设置中,让服务器监控王软件定期去访问这个网站(如60秒一次),如果不能访问,说明数据库存在问题,将故障回报至您的邮箱或手机中,让您在第一时间内得知网站访问情况。如果连续几次都不能访问,您可以选择自动重启服务器,从而达到无人值守的状态。
解决方法四:
设定服务器监控王的SQL监视,定期对mysql是否运行进行定期监视,如有问题立即重启或回报。
解决方法五:
对于上面问题中提到某台服务器准时在挂掉,如凌晨5点,产生这样的原因分析可能与当前流行的discuz论坛的自动定时备份有关,因为很多客户定时在凌晨时段自动备份mysql数据库,导致mysql工作忙碌(如有很多的mysql用户),可以建立一个计划任务,定时如早上6时将mysql重启一下。
解决方法六:
更换为非windows主机,运行更少的mysql+PHP网站,当然对于从事虚拟主机业务的运营商来说是一项损失。
mysql create table user(cardNum int);
Query OK, 0 rows affected (0.11 sec)
mysql create table borrow(cardNum int,foreign key(cardNum) references user(carNum));
Query OK, 0 rows affected (0.16 sec)
mysql
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流