文章標簽 ‘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 標簽: , ,

無覓相關文章插件,快速提升流量

30选5怎么中奖