文章标签 ‘mysql’

查看mysql数据库中某个库的存储过程

2012年1月11日 没有评论

如果只想知道存储过程的名字,有两种方法

  • 方法一:
select `name` from mysql.proc where db = '数据库名' and `type` = 'PROCEDURE';
  • 方法二:
use 数据库名

show procedure status;

查看存储过程的代码

use 数据库名

show create procedure proc_name;
分类: MySQL 标签: ,

mysql的between的边界问题

2012年1月5日 没有评论

mysql的sql语句中可以使用between来限定一个数据的范围,例如:

select * from user where userId between 5 and 7;

查询userId为5、6,7的user,userId范围是包含边界值的,也等同如下查询:

select * from user where userId >= 5 and userId <= 7;

很多地方都提到between是给定的范围是大于等第一值,小于第二个值,其实这是不对的。此前我一直也是这么认为,通过实验,结论是包含两边的边界值,如果实在拿不准,可以采用>= 、<=的方式来指定条件。

另外 not  between的范围是不包含边界值。

分类: MySQL 标签: ,

配置记录mysql服务器的慢查询日志

2012年1月5日 没有评论

mysql服务可以把超过指定规定时间的sql语句已日志的方式记录下来,检查当前mysql服务有没有记录慢查询的命令为:

/usr/local/mysql/bin/mysqladmin var | grep log_slow | tr -d "|"

如果看到log_slow_queries OFF则没有启用,启用的方法很简单,把如下配置放在mysql的配置文件my.cnf中的mysqld段里即可。

log-slow-queries	= /var/lib/mysql/slow-queries.log
long_query_time		= 1
log-queries-not-using-indexes
log-slow-admin-statements

上面的配置打开了slow query日志,将会捕获了执行时间超过了1秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql /slow-queries.log文件中。

log-slow-queries
存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。

long_query_time
如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒。

log-queries-not-using-indexes
MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。

log-slow-admin-statements
一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。

需要说明的是long_query_time很多地方都说最小是1秒,其实该值可以是一个浮点数,起码在mysql 5版本中可以这么配置,例如 0.1,也就是100毫秒。

分类: MySQL 标签: ,

MySql表结构修改常用语句

2011年12月20日 没有评论
  • 增加列

增加的列位于最后

alter table table_name add col_name varchar(20);

alter table table_name add col_name varchar(20) default 'test' not null;

alter table table_name add column col_name varchar(20) default 'test' not null;

增加的列在指定的列之后

alter table table_name add col_name varchar(20) after exists_col_name;

增加的列位于第一列

alter table table_name add col_name varchar(20) first;
  • 修改列

修改列的类型

alter table table_name modify col_name varchar(40);	//假设原来的类型是varchar(20)

alter table table_name modify col_name int(11);		//从varchar修改为int

alter table table_name change col_name col_name varchar(20);	//从int修改为varchar

修改列名

alter table table_name change old_col_name new_col_name varchar(20);
  • 删除列
alter table table_name drop col_name;

alter table table_name drop column col_name;
分类: MySQL 标签: ,

清理MySql的日志文件mysql-bin.00000

2011年11月15日 1 条评论

有一个应用运行在aws的ec2上面,由于存储硬盘比较小,只有8G左右的容量,最初刚配置好环境(按照了php、mysql、nginx等),使用的硬盘只有不到3G,运行一段后,发现硬盘已经用了5G多了,即使清除了nginx的日志,硬盘还是接近5G。决定找出是谁占用了硬盘空间。

通过命令

du -h --max-depth=1 /

查看根目录下每个文件夹所占用存储的大小,发现/var占用了快3G,进一步使用du命令,发现是存放mysql数据文件的文件夹占用了绝大部分空间,进入该文件夹,发现有很多mysql-bin.00000开头的文件,而且其中的某些达到了1G以上,google发现原来这些用户是mysql记录的日志文件,用于数据库崩溃后恢复数据和主从数据库进行数据同步的。如果没有进行主从数据库,可以通过修改配置文件让mysql关闭记录操作日志功能,关闭只需要在log-bin=mysql-bin前加上一个“#”即可,不要忘记重启mysql服务。

清理日志方法为:

PURGE MASTER LOGS TO 'mysql-bin.000013'; 
或
PURGE MASTER LOGS BEFORE '2010-10-18 00:00:00';

另外可以通过 RESET MASTER 来删除整个日志文件,注意,如果使用主从数据库,在操作前先确保从数据库已经完全同步了主数据库的数据。
上述命令都是登陆到mysql后执行的。

mysql 导入数据时内存溢出问题

2011年9月5日 没有评论

用mysqldump导出一个数据库,其中有两个表数据有20多W,执行导入的时候老是保内存溢出,试验了多种方法,始终不行,后来看mysql的服务器的配置,发现里面没有啥设置,于是在里面增加一个max_allowed_packet=32M配置,然后重新导入时候没有报错,数据完全导入了。

后来发现mysqldump导出的数据默认是–complete-insert,及把所有的值都写在一行,估计插入的时候会全部读入内存从而导致内存溢出,然后可以通过–extended-insert=false(默认为true)来设置每一条记录都是一个insert语句,但是这样速度上肯定不及前面那种。

分类: MySQL 标签: , ,

无觅相关文章插件,快速提升流量