查看mysql数据库中某个库的存储过程
如果只想知道存储过程的名字,有两种方法
- 方法一:
select `name` from mysql.proc where db = '数据库名' and `type` = 'PROCEDURE';
- 方法二:
use 数据库名 show procedure status;
查看存储过程的代码
use 数据库名 show create procedure proc_name;
如果只想知道存储过程的名字,有两种方法
select `name` from mysql.proc where db = '数据库名' and `type` = 'PROCEDURE';
use 数据库名 show procedure status;
查看存储过程的代码
use 数据库名 show create procedure proc_name;
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服务可以把超过指定规定时间的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毫秒。
增加的列位于最后
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;
有一个应用运行在aws的ec2上面,由于存储硬盘比较小,只有8G左右的容量,最初刚配置好环境(按照了php、mysql、nginx等),使用的硬盘只有不到3G,运行一段后,发现硬盘已经用了5G多了,即使清除了nginx的日志,硬盘还是接近5G。决定找出是谁占用了硬盘空间。
通过命令
查看根目录下每个文件夹所占用存储的大小,发现/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后执行的。
用mysqldump导出一个数据库,其中有两个表数据有20多W,执行导入的时候老是保内存溢出,试验了多种方法,始终不行,后来看mysql的服务器的配置,发现里面没有啥设置,于是在里面增加一个max_allowed_packet=32M配置,然后重新导入时候没有报错,数据完全导入了。
后来发现mysqldump导出的数据默认是–complete-insert,及把所有的值都写在一行,估计插入的时候会全部读入内存从而导致内存溢出,然后可以通过–extended-insert=false(默认为true)来设置每一条记录都是一个insert语句,但是这样速度上肯定不及前面那种。