Mysql篇

1.数据删除
背景:服务器是虚拟机,硬盘只有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执行起来就会相当的快。
    2. 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。
    3. 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服务没有运行起来

4. 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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容