这里抽时间和朋友们分享一下我以前学习MySQL总结的一些笔记,本来总结的文档有100多页,现在每天整理一点分享给大家。
1、MySQL常用命令
序号 | 命令 | 解释 |
1 | SHOW CHARACTER SET | 显示所有可用的字符集 |
2 | SHOW COLLATION | 显示所有可用的字符校对 |
3 | SHOW DATABASES | 显示服务器主机上的数据库 |
4 | SHOW CREATE DATABASE | 显示数据库定义 |
5 | SHOW TABLES | 显示定数据库中的非TEMPORARY表信息 |
6 | SHOW CREATE TABLE tbl_name | 显示表定义 |
7 | SHOW COLUMNS FROM tbl_name | 显示在一个给定表中的各列的信息 |
8 | SHOW INDEX FROM tbl_name | 显示在一个给定表中的索引信息 |
9 | SHOW OPEN TABLES | 显示在表缓存中当前被打开的非TEMPORARY表 |
10 | SHOW GRANTS FOR user_name | 显示为用户账户复制权限时必须发布的GRANT语句 |
11 | SHOW PRIVILEGES | 显示MySQL服务器支持的系统权限清单 |
12 | SHOW TRIGGERS | 显示触发程序 |
13 | SHOW VARIABLES | 显示MySQL系统变量 |
14 | SHOW ENGINE engine_name {LOGS | STATUS } | 显示存储引擎的日志或状态信息 |
15 | SHOW ENGINES | 显示存储引擎的状态信息 |
16 | SHOW PROCESSLIST | 显示哪些线程正在运行 |
17 | SHOW STATUS | 显示服务器状态信息 |
18 | SHOW ERRORS | 显示由上一个生成消息的语句导致的错误 |
19 | SHOW WARNINGS | 显示由上一个生成消息的语句导致的错误、警告和注意消息 |
20 | DESCRIBE tbl_name [col_name | wild] | 提供有关表中各列的信息 |
21 | use db_name; | 使用数据库,用于后续语句 |
22 | select now(); | 查询时间 |
23 | select user(); | 查询当前用户 |
24 | select version(); | 查询数据库版本 |
25 | select database(); | 查询当前使用的数据库 |
26 | flush privileges; | 用于从mysql数据库中的授权表重新载入权限。 |
27 | clear | 中断输入命令 |
29 | help | 显示帮助列表 |
30 | exit or quit | 退出mysql |
31 | status | 显示mysql服务状态 |
32 | tee | 记录所有输入,然后输出到文件 |
33 | notee | 结束tee输入 |
34 | source file_name | 使用sql脚本 |
Show命令的补充:
show columns from table_name;
show index from table_name;
show grants for ‘jiangshouzhuang’@’localhost’
语法是:mysqladmin [options] command1 command2 …
options | ||
-f | --force | 出现错误可以继续执行;drop database不需要确认 |
-i n | --sleep=n | 每n秒钟重复命令 |
-r | --relative | 配合参数-i使用显示当前操作与上次操作的差异,目前该选项只用于extended-status命令 |
-E | --vertical | 垂直打印输出。类似于--relative,但垂直打印输出。 |
-s | --silent | 如果不能建立与服务器的连接则以沉默方式退出。 |
-w n | --wait=n | 如果不能建立连接,等待并重试n次。 |
--connect-timeout | 连接超时之前的最大秒数。默认值为43200(12小时)。 | |
--shutdown-timeout | 等候关闭的最大秒数。默认值为3600(1小时)。 |
command | |
create dbname | 创建数据库(同CREATE DATABASE) |
drop dbname | 删除数据库(同DROP DATABASE) |
flush-hosts | 刷新主机缓存中的所有信息。(同FLUSH HOSTS) |
flush-logs | 刷新所有日志(同FLUSH LOGS) |
flush-status | 清除状态变量(同FLUSH STATUS) |
flush-tables | 刷新所有表(同FLUSH TABLES) |
flush-threads | 刷新线程缓存 |
flush-privileges | 重载授权表(同FLUSH PRIVILEGES) |
password newpassw | 设置用户密码(同SET PASSWORD) |
processlist | 显示活动服务器线程的列表(同SHOW THREADS) |
kill id1, id2, … | 杀掉服务器线程(同KILL) |
ping | 检查服务器是否仍活动 |
reload | 重载授权表 |
refresh | 刷新所有表并关闭和打开日志文件 |
shutdown | 停止服务器 |
start-slave / stop-slave | 启停止服务器上复制的附属进程 |
status | 显示短服务器状态消息 |
extended-status | 显示服务器状态变量及其值(同SHOW STATUS) |
variables | 显示服务器系统变量及其值(同SHOW VARIABLES) |
version | 显示服务器的版本信息 |
举个例子,杀掉一个进程:
i2ksvr /home/mysql>mysqladmin -u root -pzhangyun processlist
+-----+-----------------+-----------+----+---------+------+-----------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-----------------+-----------+----+---------+------+-----------------------------+------------------+
| 1 | event_scheduler | localhost | | Daemon | 1227 | Waiting for next activation | |
| 88 | root | localhost | | Sleep | 978 | | |
| 496 | root | localhost | | Query | 0 | | show processlist |
+-----+-----------------+-----------+----+---------+------+-----------------------------+------------------+
i2ksvr /home/mysql> mysqladmin -u root -pzhangyun kill 上面的Id号88
3、mysql的数据库和实例
1、数据库:物理操作系统文件或其他形式文件类型的集合。在mysql中,数据库文件可以是frm、myd、myi、ibd结尾的文件。
2、实例:由数据库后台进程/线程以及一个共享内存区组成。共享内存可以被运行的后台进程/线程所共享。需要牢记的是,数据库实例才是真正用来操作数据库文件的。
3、查看数据库启动实例时,会到哪里去查找配置文件
i2ksvr6 /home/mysql> mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf /home/mysql/my.cnf ~/.my.cnf
可以看到,mysql是按照/etc/my.cnf --> /etc/mysql/my.cnf -->…顺序来读取的。相同的配置项以最后一个配置文件中的配置项为准。
4、在mysql环境里执行Linux的命令:
mysql>\!ls -lh /home/mysql/data
总计 19M
-rw-rw---- 1 mysql mysql 6 2012-08-27 14:17 i2ksvr6.pid
-rw-rw---- 1 mysql mysql 18M 2012-08-28 15:32 ibdata1
-rw-rw---- 1 mysql mysql 2.9M 2012-08-28 15:32 ib_logfile0
-rw-rw---- 1 mysql mysql 1 2012-08-27 16:24 ib_logfile1
drwx------ 2 mysql mysql 2.4K 2012-08-24 11:13 mysql
drwx------ 2 mysql mysql 824 2012-08-24 11:13 performance_schema
drwx------ 2 mysql mysql 48 2012-08-24 11:13 test
drwx------ 2 mysql mysql 8.9K 2012-08-24 11:14 xmppdb
或用system命令
mysql>system ls -lh /home/mysql/data
总计 19M
-rw-rw---- 1 mysql mysql 6 2012-08-27 14:17 i2ksvr6.pid
-rw-rw---- 1 mysql mysql 18M 2012-08-28 15:32 ibdata1
-rw-rw---- 1 mysql mysql 2.9M 2012-08-28 15:32 ib_logfile0
-rw-rw---- 1 mysql mysql 1 2012-08-27 16:24 ib_logfile1
drwx------ 2 mysql mysql 2.4K 2012-08-24 11:13 mysql
drwx------ 2 mysql mysql 824 2012-08-24 11:13 performance_schema
drwx------ 2 mysql mysql 48 2012-08-24 11:13 test
drwx------ 2 mysql mysql 8.9K 2012-08-24 11:14 xmppdb
5、mysql的组件
连接池组件
管理服务和工具组件
SQL接口组件
查询分析器组件
优化器组件
缓冲组件
插件式存储引擎
物理文件
6、创建存储
mysql> delimiter //
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 1;
WHILE v1 <= 10000000 DO
insert into t1 values(v1);
SET v1 = v1 + 1;
END WHILE;
END//
执行存储:
mysql> CALL dowhile ();
指定输出的变量:
mysql> CREATE PROCEDURE simpleproc (OUT jiang INT)
-> BEGIN
-> SELECT COUNT(*) INTO jiang FROM t1;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> call counts(@a);
Query OK, 1 row affected (4.33 sec)
mysql> SELECT @a;
+----------+
| @a |
+----------+
| 10000000 |
+----------+
1 row in set (0.00 sec)
7、日志信息
(1)错误日志
mysql> show variables like 'log_error';
+---------------+------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------+
| log_error | /home/mysql/log/error/mysqlerr.err |
+---------------+------------------------------------+
(2)慢查询日志,默认数据库没有打开。
mysql> show variables like '%long%';
+---------------------------------------------------+-----------+
| Variable_name | Value |
+---------------------------------------------------+-----------+
| long_query_time | 10.000000 |
| max_long_data_size | 16777216 |
| performance_schema_events_waits_history_long_size | 10000 |
+---------------------------------------------------+-----------+
mysql> show variables like '%log_slow%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | ON |
+------------------+-------+
另外一个和慢查询日志有关的参数是log_queries_not_using_indexes,如果运行的SQL语句没有使用索引,则MySQL数据库同样会将这条SQL语句记录在慢查询日志里面。
mysql> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON |
+-------------------------------+-------+
使用mysqldumpslow命令,分析慢查询日志
比如想获取锁定时间最长的10条SQL语句,可以运行:
mysqldumpslow–s al –n 10 i2ksvr6-slow.log
MySQL5.1开始支持将慢查询日志记录到一张表里。但是需要将log_output改为table,如下:
mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
mysql> set global log_output='TABLE';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
参数log_output是动态的,并且是全局的。可以在线进行修改。
查看slow_log表定义发现,该表是CSV引擎,对大数据查询效率不高,可以转化为MyISAM表,提供查询效率。
mysql> alter table mysql.slow_log engine=myisam;
ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled
需要关闭慢查询,才可以修改。
mysql> set global slow_query_log=off;
Query OK, 0 rows affected (0.01 sec)
其实,转化为MyISAM为有额外的开销。
mysql> alter table mysql.slow_log engine=myisam;
Query OK, 2 rows affected (0.20 sec)
Records: 2 Duplicates: 0 Warnings: 0
(3)查询日志
记录了所有对MySQL数据库请求的信息。同样有一张表general_log日志记录。(MYSQL5.1开始)
mysql> show variables like '%general_log%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | OFF |
| general_log_file | /home/mysql/data/i2ksvr6.log |
+------------------+------------------------------+
(4)二进制日志
记录了对数据库执行更改的所有操作,但是不包括select和show这类操作。
作用:恢复数据和复制数据
通过参数配置log-bin可以开启二进制日志,如果不指定name,则默认二进制日志文件名为主机名,后缀名为二进制日志的序列号。
log-bin= ../binlog/mysqlbinlog
指当前目录的binlog目录下,文件名为mysqlbinlog,后缀为序列号。
binlog_format参数十分重要,这影响了记录二进制日志的格式。值有STATEMENT、ROW、MIXED。
二进制日志文件,用mysqlbinlog工具查看
8、套接字文件
mysql> show variables like '%socket%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
9、pid文件
当mysql启动时,会将自己的进程ID写入一个文件中,该文件即为pid文件。
mysql> show variables like '%pid_file%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| pid_file | /home/mysql/data/i2ksvr6.pid |
+---------------+------------------------------+