【服务器迁移】Mysql数据库篇
背景:服务器是虚拟机,硬盘只有50G,数据库中error表,60万的报警数据,已经达到50G,导致磁盘已满。也未打算进行数据归档,需要删除表中部分无用的数据。遇到的问题和解决办法.
- 死锁现象
通过mysql show processlist检查mysql死锁的方法
SUPER权限,则可以看到全部的线程;否则只能看到自己发起的线程
注:MySQL帐户运行的线程
Kill掉死锁的进程
- 删除数据太慢
在考虑删除部分数据时,开始考虑直接用delete from tablename where (符合的条件),那么如何来删除呢?
当时首先采取编写php脚本的方法,通过浏览器执行,结果出现超时终止程序。因为php默认脚本执行超时是30秒,php.ini中的max_execution_time变量指定,服务器会在30秒强行终止正在执行的程序。
为了解决超时问题,可以通过修改php.ini的脚本执行时间限制的方法,也可以通过用php的函数取消脚本时间限制,当然还有其他的方法.我采取了用Set_time_limit(0)来解决超时的问题。
注:set_time_limit用来设置脚本的超时时间,此函数规定从该句运行是起程序必须在指定的秒数内运行结束,超时则程序出错退出
秒数为0时,表示该脚本没有时间限制
其实我们完全用命令行去运行php脚本就可以解决php执行超时的问题。再后来直接通过mysql后台执行sql语句就行,没有必要写php脚本。
但是问题又出现了,sql语句执行相当缓慢,删除1万条数据(数据里面包含大量的详细报警信息,所以数据很大)需要1个小时。
当然不是索引的问题,不过最终还是找到了解决办法,在where指定id段范围,sql执行起来就会相当的快。
- Mysql服务启动
背景:服务器本身自带mysql数据库,sa人员安装了新的mysql数据库,启动的数据库时,该如何启动指定的mysql。
当时启动mysql服务,只知道要通过etc/init.d/mysql start,通过和dba沟通,才知道不管启动的那个mysql,其实都是指向一个库的。所以如果跟mysql版本没有多大关系的时候启动那个都没有关系,他们共用一个my.cnf配置文件。
/mysqld_safe --defaults-file=/etc/my.cnf --user=root &
除了去对应的目录下去启动mysql服务,我们还可以怎么启动指定的mysql服务?
将mysql/share/mysql.server 拷贝到etc/init.d目录下即可。原来我们启动的服务其实就是mysql/share/mysql.server,只不过默认在etc/init.d下存在一个mysql.server的别名mysql。
- Mysql运行
Mysql -u root -p时,出现如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Mysql.sock是mysql主机和客户机在同一host(物理服务器)上的时候,使用unix domain socket作为通讯协议的载体,它比tcp快.通常遇到上述问题是由于mysql服务没有运行起来
- mysql导数据
由于sql文件大于4G,在linux用unzip命令解压zip压缩包是不成功的,需要用7zip软件,命令格式:7z e filename
大数据导入:mysql>source 相关路径/filename.sql文件即可
- 无法登陆系统
登录系统时,返回信息报错信息如下:
Mysqld connot connect to MySql 4.1+using the old insecure authentication
解决方法:
mysql> set old_passwords=0; mysql> update user set password=password("123") where user='root'; mysql> flush privileges; mysql> exit;