【服务器迁移】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;      

 

posted @ 2015-05-07 13:47  买丶醉  阅读(588)  评论(0编辑  收藏  举报