导图社区 MySQL知识点
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一。本思维导图是作者自己的MySQL学习经验总结,希望对你有帮助!
编辑于2021-05-13 18:13:07MySql数据库
MySql安装和配置
下载
下载地址:https://dev.mysql.com/downloads/mysql/
安装
Windows
安装
MySQL 图形化安装(.msi 安装文件) 学习链接:http://c.biancheng.net/view/7135.html
安装类型
Developer Default:默认安装类型
Server only:仅作为服务
Client only:仅作为客户端
Full:完全安装
Custom:自定义安装类型
免安装版(.zip 压缩文件)学习链接:http://c.biancheng.net/view/2412.html
1、免安装文件解压
2、配置环境变量,在系统变量 path 后面追加mysql解压目录。 例如:D:\mysql-5.7.20-winx64\bin
3、创建mysql配置文件,my.inimy.ini文件存在放解压目录下面,不是bin目录下面
4、安装 MySQL 服务,执行命令为 mysqld–install命令需在cmd下面进入mysql的bin目录下面执行
5、执行 MySQL 初始化命令,在 MySQL 目录下生成 data 文件夹mysqld --initialize-insecure --user=mysql
6、启动 MySQL 服务,并使用用户 root 登录,同时设置登录密码net start mysqlmysqladmin -u root -p password
7、测试 MySQL 是否部署成功
配置环境变量
1、我的电脑上点击右键选择属性--》高级系统设置--》环境变量
2、新建MYSQL_HOME变量,并配置:D:\Develop\mysql\mysql-8.0.12 D:\Develop\mysql\mysql-8.0.12 为mysql解压的位置
3、编辑path系统变量,将%MYSQL_HOME%\bin添加到path变量后
Linux
192.168.191.115 root/gjr@123
配置文件
Windows下面是my.ini学习链接:http://c.biancheng.net/view/7571.html
Linux下面是my.cnf学习链接:http://c.biancheng.net/view/7618.html
安装目录结构介绍学习链接:http://c.biancheng.net/view/7570.html
1、bin 目录 用于放置一些可执行文件,如 mysql.exe、mysqld.exe、mysqlshow.exe 等
2、docs 目录存放一些文档
3、Data 目录(通过my.ini或my.cnf的datadir=XXX可进行配置)登录数据库后,可使用 SHOW GLOBAL VARIABLES LIKE "%Datadir%"; 命令查看 Data 目录位置Data 目录中用于放置一些日志文件以及数据库。我们创建和保存的数据都存在这个目录里
4、include 目录用于放置一些头文件,如:mysql.h、mysql_ername.h 等
5、lib 目录用于放置一系列库文件
6、share 目录用于存放字符集、语言等信息
7、my.ini 文件my.ini 是 MySQL 默认使用的配置文件,一般情况下,只要修改 my.ini 配置文件中的内容就可以对 MySQL 进行配置
数据库文件存放目录结构
系统数据库
mysql
performance_schema
sys
auto.cnf
MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性
ib_logfile0ib_logfile1
支持事务性引擎的 redo 日志文件
ibdata1
共享表空间(系统表空间)。如果采用 InnoDB 引擎,默认大小为 10M
ibtmp1
为存储临时对象的空间,比如临时表对象等
用户自定义数据库
db.opt
保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则
.frm文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件。命名方式为表名.frm注意:MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间
用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构
InnoDB 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
.ibd
采用独享表空间时 InnoDB 表的数据文件
.ibdata
采用共享表空间时,所有 InnoDB 表的数据均存放在 .ibdata 中
1、共享表空间的数据
2、变更缓冲区
3、双写缓冲区
4、撤销日志
MyISAM 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
.MYD
用于存放 MyISAM 表的数据
.MYI
存放 MyISAM 表的索引及相关信息
MERGE 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
.MRG
Memory 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
Archive 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
.ARZ
CSV存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
.CSM
.CSV
BLACKHOLE 存储引擎
.frm
.frm文件用来保存每个数据表的元数据(meta)和表结构等信息
常用图形化管理工具
1、MySQL Workbench下载地址:http://dev.MySQL.com/downloads/workbench/
2、phpMyAdmin下载地址:https://www.phpmyadmin.net/
3、Navicat下载地址:http://www.avicat.com/
4、SQLyog下载地址:http://www.webyog.com/en/index.php
5、MySQLDumper下载地址:无
5种常用工具比较
1、MySQL Workbench MySQL 是官方提供的图形化管理工具,分为社区版和商业版,社区版完全免费,而商业版则是按年收费。支持数据库的创建、设计、迁移、备份、导出和导入等功能,并且支持 Windows、Linux 和 mac 等主流操作系统
2、phpMyAdmin 是最常用的 MySQL 维护工具,使用 PHP 编写,通过 Web 方式控制和操作 MySQL 数据库,是 Windows 中 PHP 开发软件的标配。通过 phpMyAdmin 可以完全对数据库进行操作,例如建立、复制、删除数据等。管理数据库非常方便,并支持中文,不足之处在于对大数据库的备份和恢复不方便,对于数据量大的操作容易导致页面请求超时
3、Navicat MySQL 是一个强大的 MySQL 数据库服务器管理和开发工具。它可以与任何版本的 MySQL 一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等。对于新手来说也易学易用。Navicat 使用图形化的用户界面(GUI),可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat 支持中文,有免费版本提供
4、SQLyog 是一款简洁高效、功能强大的图形化管理工具。SQLyog 操作简单,功能强大,能够帮助用户轻松管理自己的 MySQL 数据库。SQLyog 中文版支持多种数据格式导出,可以快速帮助用户备份和恢复数据,还能够快速地运行 SQL 脚本文件,为用户的使用提供便捷。使用 SQLyog 可以快速直观地让用户从世界的任何角落通过网络来维护远端的 MySQL 数据库
5、MySQLDumper 使用基于 PHP 开发的 MySQL 数据库备份恢复程序,解决了使用 PHP 进行大数据库备份和恢复的问题。数百兆的数据库都可以方便地备份恢复,不用担心网速太慢而导致中断的问题,非常方便易用
数据库的基本操作
1、查看或显示数据库
查看数据库的语法格式为:SHOW DATABASES [LIKE '数据库名'];
2、创建数据库
范例:CREATE DATABASE IF NOT EXISTS 数据库名称 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_chinese_ci;
3、修改数据库
MySQL 数据库中只能对数据库使用的字符集和校对规则进行修改,数据库的这些特性都储存在 db.opt 文件中范例:ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET gb2312 DEFAULT COLLATE gb2312_chinese_ci;
4、删除数据库
DROP DATABASE IF EXISTS 数据库名称;
5、选择数据库
当用 CREATE DATABASE 语句创建数据库之后,该数据库不会自动成为当前数据库,需要用 USE 来指定当前数据库。其语法格式为:USE <数据库名>
6、注释
1、单行注释
1、#单行注释注释范例如下:#注释内容
2、--单行注释注释范例如下:--注释内容
2、多行注释
1、注释范例如下:/* 第一行注释内容 第二行注释内容*/
7、查看系统帮助
1、查看帮助的命令是 HELP,语法格式如下: HELP 查询内容
2、常用Help命令
查询帮助文档目录列表 HELP'contents';
查看具体内容 HELP 'Data Types';
查询某命令 HELP CREATE TABLE
3、帮助文档涉及的表
help_category:关于帮助主题类别的信息
help_keyword:与帮助主题相关的关键字信息
help_relation:帮助关键字信息和主题信息之间的映射
help_topic:帮助主题的详细内容
数据库设计
数据类型和存储引擎
1、数据类型
1、数值类型
1、整数类型
TINYINT存储范围:-128〜127占用字节:1字节
SMALLINT存储范围:-32768〜32767占用字节:2字节
MEDIUMINT存储范围:-8388608〜8388607占用字节:3字节
INT (INTEGER)存储范围:-2147483648〜2147483647占用字节:4字节
BIGINT存储范围:-9223372036854775808〜9223372036854775807占用字节:8字节
2、小数类型
FLOAT占用字节:4字节存储范围:有符号的取值范围:-3.402823466E+38~-1.175494351E-38无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38
DOUBLE占用字节:8字节存储范围:有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308
DECIMAL (M, D),DEC占用字节: M+2 个字节
2、日期/时间类型
YEAR日期格式:YYYY占用字节:1字节
TIME日期格式:HH:MM:SS占用字节:3字节
DATE日期格式:YYYY-MM-DD占用字节:3字节
DATETIME日期格式:YYYY-MM-DD HH:MM:SS占用字节:8字节
TIMESTAMP日期格式:YYYY-MM-DD HH:MM:SS占用字节:4字节
3、字符串类型
类型名称: CHAR(M)说明: 固定长度非二进制字符串存储需求: M 字节,1<=M<=255
类型名称: VARCHAR(M)说明: 变长非二进制字符串存储需求: L+1字节,在此,L< = M和 1<=M<=255
类型名称: TINYTEXT说明: 非常小的非二进制字符串存储需求: L+1字节,在此,L<2^8
类型名称: TEXT说明: 小的非二进制字符串存储需求: L+2字节,在此,L<2^16
类型名称: MEDIUMTEXT说明: 中等大小的非二进制字符串存储需求: L+3字节,在此,L<2^24
类型名称: LONGTEXT说明: 大的非二进制字符串存储需求: L+4字节,在此,L<2^32
类型名称: ENUM说明: 枚举类型,只能有一个枚举字符串值存储需求: 1或2个字节,取决于枚举值的数目 (最大值为65535)
类型名称: SET说明: 一个设置,字符串对象可以有零个或 多个SET成员存储需求: 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)
4、二进制类型
类型名称: BIT(M) 说明: 位字段类型 存储需求: 大约 (M+7)/8 字节
类型名称: BINARY(M) 说明: 固定长度二进制字符串 存储需求: M 字节
类型名称: VARBINARY (M) 说明: 可变长度二进制字符串 存储需求: M+1 字节
类型名称: TINYBLOB (M)说明: 非常小的BLOB 存储需求: L+1 字节,在此,L<2^8
类型名称: BLOB (M) 说明: 小 BLOB存储需求: L+2 字节,在此,L<2^16
类型名称: MEDIUMBLOB (M) 说明: 中等大小的BLOB 存储需求: L+3 字节,在此,L<2^24
类型名称: LONGBLOB (M) 说明: 非常大的BLOB 存储需求: L+4 字节,在此,L<2^32
2、存储引擎使用SHOW ENGINES;语句查看系统所支持的引擎类型
存储引擎类型
存储引擎名称: InnoDB描述: 具备外键支持功能的事务处理引擎学习链接:http://c.biancheng.net/view/8021.html
重做日志文件(redo log file):ib_logfile0 和 ib_logfile1 InnoDB 可以通过重做日志将数据库宕机时已经完成但还没有来得及将数据写入磁盘的事务恢复,也能将所有部分完成并已经写入磁盘的未完成事务回滚,并且将数据还原,以此来保证数据的完整性
每个 InnoDB 存储引擎至少有 1 个重做日志文件组(group),每个文件组下至少有 2 个重做日志文件,如默认的 ib_logfile0 和 ib_logfile1
共享表空间InnoDB 表的数据和索引都存放在一个表空间
共享表空间文件:ibdata1
共享表空间文件设置,格式如下:innodb_data_file_path=datafile_spec1[;datafile_spec2]...范例:innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
注意事项:1、若多个共享文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能2、指定多个文件时,autoextend 属性只在最后一个数据文件中指定,表示表空间自动扩展3、设置完 innodb_data_file_path 参数后,所有基于 InnoDB 存储引擎的表的数据都会记录到该共享表空间中4、InnoDB 在创建新数据文件时不会创建目录,如果指定目录不存在,则会报错并无法启动。5、InnoDB 给共享表空间增加数据文件之后,必须要重启数据库系统才能生效
独立表空间InnoDB 表的数据和索引都会以单独的形式存放
独立表空间设置,格式如下:innodb_file_per_table=1 开启innodb_file_per_table=0 关闭命令行:SET GLOBAL innodb_file_per_table=1;SET GLOBAL innodb_file_per_table=0;
独立表空间的命名规则为表名.ibd
注意事项:单独的表空间文件只存储该表的数据、索引和缓冲等信息。无论是使用共享表空间还是独享表空间来存放表,共享表空间都是必须存在的。
常用命令:查看是否使用独立表空间:SHOW VARIABLES LIKE 'innodb_file_per_table%';
存储引擎名称: MyISAM描述: 主要的非事务处理存储引擎
存储引擎名称: ARCHIVE描述: 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引
存储引擎名称: CSV描述: 在存储数据时,会以逗号作为数据项之间的分隔符
存储引擎名称: BLACKHOLE描述: 会丢弃写操作,该操作会返回空内容
存储引擎名称: FEDERATED描述: 将数据存储在远程数据库中,用来访问远程表的存储引擎
存储引擎名称: MERGE描述: 用来管理由多个 MyISAM 表构成的表集合
存储引擎名称: NDB描述: MySQL 集群专用存储引擎
查看和修改数据库的默认存储引擎
查看默认的存储引擎命令格式:SHOW VARIABLES LIKE 'default_storage_engine%';
修改数据库临时的默认存储引擎命令格式:SET default_storage_engine=< 存储引擎名 >注意:当再次重启客户端时,默认存储引擎仍然是 InnoDB
修改数据表的存储引擎
修改数据表的存储引擎的语法格式如下:ALTER TABLE <表名> ENGINE=<存储引擎名>;
存储引擎特性汇总和对比
数据表的基本操作
约束、函数、运算符
操作表中数据
视图、索引
存储过程、触发器
事务、字符集
用户管理
1、权限表
mysql库
1、user表
用户列
Host 主机名
User 用户名
authentication_string 密码
权限列修改权限,可以使用 GRANT 语句为用户赋予一些权限也可以通过 UPDATE 语句更新 user 表的方式来设置权限
Select_priv 是否可以通过SELECT 命令查询数据
Insert_priv 是否可以通过 INSERT 命令插入数据
Update_priv 是否可以通过UPDATE 命令修改现有数据
Delete_priv 是否可以通过DELETE 命令删除现有数据
Create_priv 是否可以创建新的数据库和表
Drop_priv 是否可以删除现有数据库和表
Reload_priv 是否可以执行刷新和重新加载MySQL所用的各种内部缓存的特定命令,包括日志、权限、主机、查询和表
Shutdown_priv 是否可以关闭MySQL服务器。将此权限提供给root账户之外的任何用户时,都应当非常谨慎
Process_priv 是否可以通过SHOW PROCESSLIST命令查看其他用户的进程
File_priv 是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令
Grant_priv 是否可以将自己的权限再授予其他用户
References_priv 是否可以创建外键约束
Index_priv 是否可以对索引进行增删查
Alter_priv 是否可以重命名和修改表结构
Show_db_priv 是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库
Super_priv 是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程;使用SET GLOBAL命令修改全局MySQL变量,执行关于复制和日志的各种命令。(超级权限)
Create_tmp_table_priv 是否可以创建临时表
Lock_tables_priv 是否可以使用LOCK TABLES命令阻止对表的访问/修改
Execute_priv 是否可以执行存储过程
Repl_slave_priv 是否可以读取用于维护复制数据库环境的二进制日志文件
Repl_client_priv 是否可以确定复制从服务器和主服务器的位置
Create_view_priv 是否可以创建视图
Show_view_priv 是否可以查看视图
Create_routine_priv 是否可以更改或放弃存储过程和函数
Alter_routine_priv 是否可以修改或删除存储函数及函数
Create_user_priv 是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户
Event_priv 是否可以创建、修改和删除事件
Trigger_priv 是否可以创建和删除触发器
Create_tablespace_priv 是否可以创建表空间
安全列安全列主要用来判断用户是否能够登录成功
ssl_type 支持ssl标准加密安全字段
ssl_cipher 支持ssl标准加密安全字段
x509_issuer 支持x509标准字段
x509_subject 支持x509标准字段
plugin 引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户
password_expired 密码是否过期 (N 未过期,y 已过期)
password_last_changed 记录密码最近修改的时间
password_lifetime 设置密码的有效时间,单位为天数
account_locked 用户是否被锁定(Y 锁定,N 未锁定)
资源控制列字段的默认值为 0,表示没有限制。一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。
max_questions 规定每小时允许执行查询的操作次数
max_updates 规定每小时允许执行更新的操作次数
max_connections 规定每小时允许执行的连接操作次数
max_user_connections 规定允许同时建立的连接次数
2、其他权限表
db表表中存储了用户对某个数据库的操作权限
用户列
Host 主机名
Db 数据库名
User 用户名
权限列
db 表中的权限列和 user 表中的权限列大致相同,只是user 表中的权限是针对所有数据库的,而 db 表中的权限只针对指定的数据库。如果希望用户只对某个数据库有操作权限,可以先将 user 表中对应的权限设置为 N,然后在 db 表中设置对应数据库的操作权限。
tables_priv表tables_priv 表用来对单个表进行权限设置
字段名: Host说明: 主机
字段名: Db说明: 数据库名
字段名: User说明: 用户名
字段名: Table_name 说明: 表名
字段名: Grantor说明: 修改该记录的用户
字段名: Timestamp说明: 修改该记录的时间
字段名: Table_priv说明: 表示对表的操作权限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等
字段名: Column_priv说明: 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References
columns_priv 表columns_priv 表用来对单个数据列进行权限设置
字段名: Host说明: 主机
字段名: Db说明: 数据库名
字段名: User说明: 用户名
字段名: Table_name说明: 表名
字段名: 说明:
字段名: Column_name说明: 数据列名称,用来指定对哪些数据列具有操作权限
字段名: Timestamp说明: 修改该记录的时间
字段名: Column_priv说明: 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References
procs_priv 表procs_priv 表可以对存储过程和存储函数进行权限设置
字段名: Host说明: 主机名
字段名: Db说明: 数据库名
字段名: User说明: 用户名
字段名: Routine_name说明: 存储过程或函数的名称
字段名: Routine_type说明: 存储过程或函数的类型,Routine_type 字段有两个值,分别是 FUNCTION 和 PROCEDURE。FUNCTION 表示这是一个函数;PROCEDURE 表示这是一个存储过程
字段名: Grantor说明: 插入或修改该记录的用户
字段名: Proc_priv说明: 表示拥有的权限,包括 Execute、Alter Routine、Grant 3种
字段名: Timestamp说明: 表示记录更新时间
2、用户以及用户权限相关操作
1、用户类操作
创建用户
方式1:基本语法格式如下:CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]范例:CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1'; OrSELECT password('test1'); -- 明文密码先进行加密处理,然后通过创建用户进行创建(密码用密文)CREATE USER 'test1'@'localhost'IDENTIFIED BY PASSWORD '*06C0BF5B64ECE2F648B5F048A71903906BA08E5C';
子主题
方式2:INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');FLUSH PRIVILEGES;
方式3:GRANT 语句创建用户的基本语法形式如下:GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'];范例:GRANT SELECT ON*.* TO 'test3'@localhost IDENTIFIED BY 'test3';
修改用户
RENAME USER 语句修改一个或多个已经存在的用户账号,语法格式如下:RENAME USER <旧用户> TO <新用户>范例:RENAME USER 'test1'@'localhost' TO 'testUser1'@'localhost';
删除用户
DROP USER 语句删除用户的语法格式如下:DROP USER <用户1> [ , <用户2> ]…范例:DROP USER 'test1'@'localhost';
使用DELETE语句删除普通用户,基本语法格式如下:DELETE FROM mysql.user WHERE Host='hostname' AND User='username';范例:DELETE FROM mysql.user WHERE Host='localhost'AND User='test2';
2、权限类操作
查看用户权限
SELECT * FROM mysql.user;注意:新创建的用户只有登录 MySQL 服务器的权限,没有任何其它权限,不能查询 user 表
使用 SHOW GRANTS FOR 语句查看权限。其语法格式如下:SHOW GRANTS FOR 'username'@'hostname';范例:SHOW GRANTS FOR 'testuser1'@'localhost';
用户授权学习链接:http://c.biancheng.net/view/7502.html
GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下:GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'][, user[IDENTIFIED BY [PASSWORD] 'password']] ...[WITH with_option [with_option]...]
删除用户权限
删除用户某些特定的权限,语法格式如下:REVOKE priv_type [(column_list)]... ON database.table FROM user [, user]...
删除特定用户的所有权限,语法格式如下:REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...范例:REVOKE INSERT ON *.* FROM 'testUser'@'localhost';
3、登录和退出服务器
登录
用以下命令来登录。mysql -h hostname|hostlP -p port -u username -p DatabaseName -e "SQL语句"范例:mysql -h localhost -u root -p密码 数据库名称 -e"执行的SQL语句"mysql -h localhost -u root -p123456 test -e"DESC student"注意:-p后面紧跟密码,中间没有空格
退出
退出 MySQL 服务器的方式很简单,只要在命令行输入 EXIT 或 QUIT 即可。“\q”是 QUIT 的缩写,也可以用来退出 MySQL 服务器
4、权限控制实现原理MySQL 权限表在数据库启动时载入内存,用户通过身份认证后,系统会在内存中进行相应权限的存取
1、连接核实阶段
登录 MySQL 服务器时,客户端连接请求中会提供用户名称、主机地址和密码,MySQL 服务器会使用 user 表中的 Host、User 和 authentication_string (MySQL 5.7 版本之前是 Password)字段执行身份检查
2、请求核实阶段
权限按照以下权限表的顺序得到数据库权限:user→db→tables_priv→columns_priv→procs_priv在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限
3、连接、请求整体过程
用户向 MySQL 发出操作请求
MySQL 首先检查 user 表,匹配 User、Host 字段值,查看请求的全局权限在 user 表中是否被授权。授权则允许操作执行,如果指定的权限在 user 表中没有被授权。MySQL 将检查 db 表
db 表是下一安全层级,其中的权限限定于数据库层级,在该层级的 SELECT 权限允许用户查看指定数据库的所有表中的数据MySQL 检查 db 权限表中的权限信息,匹配 User、Host 字段值,查看请求的数据库级别的权限在 db 表中是否被授权。授权则允许操作执行,否则 MySQL 继续向下查找
MySQL 检查 tables_priv 权限表中的权限信息,匹配 User、Host 字段值,查看请求的数据表级别的权限在 tables_priv 表中是否被授权。授权则允许操作执行,否则 MySQL 继续向下查找
MySQL 检查 columns_priv 权限表中的权限信息,匹配 User、Host 字段值,查看请求的列级别的权限在 columns_priv 表中是否被授权。授权则允许操作执行,否则 MySQL 继续向下查找
如果所有权限表都检查完毕,还是没有找到允许的权限操作,那么 MySQL 将返回错误信息,即用户请求的操作不能执行,操作失败
3、密码相关操作
root用户修改普通用户密码
使用 root 用户登录到 MySQL 服务器后,可以使用 SET 语句来修改普通用户密码。语法格式如下:SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');如果是普通用户修改密码,可省略 FOR 子句来更改自己的密码。语法格式如下:SET PASSWORD = PASSWORD('newpwd');
使用 root 用户登录 MySQL 服务器后,可以使用 UPDATE 语句修改 MySQL 数据库的 user 表的 authentication_string 字段,从而修改普通用户的密码。UPDATA 语句的语法如下:UPDATE MySQL.user SET authentication_string = PASSWORD("newpwd") WHERE User = "username" AND Host = "hostname";注意,执行 UPDATE 语句后,需要执行 FLUSH PRIVILEGES 语句重新加载用户权限
在全局级别使用 GRANT USAGE 语句指定某个账户的密码而不影响账户当前的权限。需要注意的是,使用 GRANT 语句修改密码,必须拥有 GRANT 权限。一般情况下最好使用该方法来指定或修改密码。语法格式如下:GRANT USAGE ON *.* TO 'user'@’hostname’ IDENTIFIED BY 'newpwd';
修改root密码
使用mysqladmin命令在命令行指定新密码mysqladmin -u username -h hostname -p password "newpwd"usermame 指需要修改密码的用户名称,在这里指定为 root 用户;hostname 指需要修改密码的用户主机名,该参数可以不写,默认是 localhost;password 为关键字,而不是指旧密码;newpwd 为新设置的密码,必须用双引号括起来。如果使用单引号会引发错误,可能会造成修改后的密码不是你想要的
修改MySQL数据库的user表使用 UPDATA 语句修改 root 用户密码的语法格式如下:UPDATE mysql.user set authentication_string = PASSWORD ("rootpwd) WHERE User = "root" and Host="localhost";
使用SET语句修改root用户的密码SET PASSWORD 语句可以用来重新设置其他用户的登录密码或者自己使用的账户的密码。使用 SET 语句修改密码的语法结构如下:SET PASSWORD = PASSWORD ("rootpwd");
Mysql忘记root密码后如何重置学习链接:https://blog.csdn.net/zhaobig/article/details/77985019
第一步: 命令行下面进入mysql的安装bin目录下面
第二步: 使用net stop mysql的服务名 停止mysql服务
第三步: 输入mysqld --skip-grant-tables启动mysql服务,此时mysql将以不开启权限验证的方式启动
第四步: 重新打开一个cmd命令行工具,因为上一个已经卡在那了 输入 mysql -uroot -p 然后 回车 回车,此时应该已经可以不输密码进入mysql数据库了
第五步: 修改mysql中的user表中的root用户密码 update mysql.user set authentication_string = password('654321') where user = 'root' and host='localhost';
第六步: 刷新 flush privileges;
数据库备份与恢复
根据备份的方法(是否需要数据库离线)分类
热备(Hot Backup)
解释: 热备份可以在数据库运行中直接备份,对正在运行的数据库操作没有任何的影响,数据库的读写操作可以正常执行。这种方式在 MySQL 官方手册中称为 Online Backup(在线备份)
按照备份后文件的内容
逻辑备份
逻辑备份是指备份出的文件内容是可读的,一般是文本内容。内容一般是由一条条 SQL 语句,或者是表内实际数据组成。如 mysqldump 和 SELECT * INTO OUTFILE 的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是恢复的时间较长
裸文件备份
裸文件备份是指复制数据库的物理文件,既可以在数据库运行中进行复制(如 ibbackup、xtrabackup 这类工具),也可以在数据库停止运行时直接复制数据文件。这类备份的恢复时间往往比逻辑备份短很多
冷备(Cold Backup)学习链接:http://c.biancheng.net/view/8157.html
1、解释: 冷备份必须在数据库停止的情况下进行备份,数据库的读写操作不能执行。这种备份最为简单,一般只需要复制相关的数据库物理文件即可。这种方式在 MySQL 官方手册中称为 Offline Backup(离线备份)
2、冷备份的优缺点 1) 冷备份的优点如下: 备份简单、快速,只要复制相关文件即可。 备份文件易于在不同操作系统,不同 MySQL 版本上进行恢复。 恢复相当简单,只需要把文件恢复到指定位置即可。 恢复速度快,不需要执行任何 SQL 语句,也不需要重建索引。 低度维护,高度安全。 2)冷备份的缺点如下: 备份过程中,数据库不能做其它的工作,且必须是关闭状态。 InnoDB 存储引擎冷备的文件通常比逻辑文件大很多,因为表空间存放着很多其它的数据,如 undo 段,插入缓冲等信息。 若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。 冷备也不总是可以轻易的跨平台。操作系统、MySQL 的版本、文件大小写敏感和浮点数格式都会成为问题。数据库的物理文件主要由数据库的数据文件、日志文件以及配置文件等组成。MySQL 系统有一些共有的日志文件和系统表的数据文件。每种存储引擎的物理文件也不一样,不了解的可阅读学习《不同存储引擎的数据表在文件系统里是如何表示的》 http://c.biancheng.net/view/7921.html一节。
3、冷备的备份与恢复过程学习链接:http://c.biancheng.net/view/8157.html
1、冷备份过程
第一步:先执行 FLUSH TABLES 语句将所有数据写入到数据文件的文本文件里
第二步:停掉 MySQL 服务,命令(2种方式)如下: mysqladmin -uroot -proot shutdown NET STOP mysql
第三步:备份过程就是复制整个数据目录到远程备份机或者本地磁盘上,Linux 和 Windows 命令如下:Scp -r /data/mysql/ root@远程备份机ip:/新的目录Copy -r /data/mysql/ 本地新目录
2、恢复过程
恢复过程就更简单了,仅仅需要把已备份的数据目录替换原有的目录就可以了,最后重启 MySQL 服务
3、注意事项:通过复制数据文件这种方式实现数据恢复时,必须保证两个 MySQL 数据库的主版本号一致。只有两个 MySQL 数据库主版本号相同时,才能保证它们的数据文件类型是相同的。关于 MySQL 数据库服务器的版本号第一个数字表示主版本号,例如 MySQL 5.5.21 和 MySQL 5.5.01 这两个版本的主版本号都是 5,所以这两个数据库拥有相同类型的数据文件
4、冷备份所需物理文件学习链接:http://c.biancheng.net/view/8163.html
MyISAM存储引擎
MyISAM 存储引擎的所有数据默认存放在 C:/ProgramData/MySQL/MySQL Server 5.7/Data 路径下,即配置文件(my.ini或my.cnf)中 datadir 参数的值
表结构元数据的“.frm”文件,存储表数据的“.MYD”文件,存储索引数据的“.MYI”文件
Innodb 存储引擎
存放数据和日志文件的位置参数为 innodb_data_home_dir、innodb_data_file_path 和 innodb_log_group_home_dir
表空间存储方式参数 innodb_file_per_table
共享表空间需要备份的文件
备份 innodb_data_home_dir 和 innodb_data_file_path 参数设定的所有数据文件,以及 datadir 中相应数据库目录下的所有 Innodb 存储引擎表的 .frm 文件
独立表空间需要备份的文件
备份 innodb_data_home_dir 和 innodb_data_file_path 参数设定的所有数据文件,以及 datadir 中相应数据库目录下的所有 Innodb 存储引擎表的 .frm 文件
备份 datadir 中相应数据库目录下的所有 .ibd 文件,该文件中存放的才是独享表空间方式下 Innodb 存储引擎表的数据
备份 innodb_log_group_home_dir 参数所设定的位置的所有日志文件
温备(Warm Backup)
解释: 温备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,备份时仅支持读操作,不支持写操作
按照备份数据库的内容来分
完全备份完全备份是指对数据库进行一个完整的备份,即备份整个数据库,如果数据较多会占用较大的时间和空间
部分备份部分备份是指备份部分数据库(例如,只备份一个表)
增量备份
解释:增量备份需要使用专业的备份工具。指的是在上次完全备份的基础上,对更改的数据进行备份。也就是说每次备份只会备份自上次备份之后到备份时间之内产生的数据。因此每次备份都比差异备份节约空间,但是恢复数据麻烦
差异备份
解释:差异备份指的是自上一次完全备份以来变化的数据。和增量备份相比,浪费空间,但恢复数据比增量备份简单
各种存储引擎支持的备份方式
存储引擎名称: InnoDB支持备份方式: 热备、温备、冷备
存储引擎名称: MyISAM支持备份方式: 温备、冷备
存储引擎名称: Memory支持备份方式:
存储引擎名称: Merge支持备份方式:
存储引擎名称: Archive支持备份方式:
存储引擎名称: CSV支持备份方式:
存储引擎名称: BLACKHOLE支持备份方式:
存储引擎名称: FEDERATED 支持备份方式:
通常需要备份的数据分为以下几种
表数据
二进制日志、InnoDB 事务日志
代码(存储过程、存储函数、触发器、事件调度器)
服务器配置文件
常用的备份工具
mysqldump:逻辑备份工具,适用于所有的存储引擎,支持温备、完全备份、部分备份、对于 InnoDB 存储引擎支持热备
cp、tar 等归档复制工具:物理备份工具,适用于所有的存储引擎、冷备、完全备份、部分备份
lvm2 snapshot:借助文件系统管理工具进行备份
mysqlhotcopy:名不副实的一个工具,仅支持 MyISAM 存储引擎
xtrabackup:一款由 percona 提供的非常强大的 InnoDB/XtraDB 热备工具,支持完全备份、增量备份
备份数据库
备份一个数据库
语法格式:mysqldump -u username -p dbname [tbname ...]> filename.sql
参数说明:username: 表示用户名称;dbname: 表示需要备份的数据库名称;tbname: 表示数据库中需要备份的数据表,可以指定多个数据表。省略该参数时,会备份整个数据库;右箭头“>”:用来告诉 mysqldump 将备份数据表的定义和数据写入备份文件;filename.sql:表示备份文件的名称,文件名前面可以加绝对路径。通常将数据库备份成一个后缀名为.sql的文件
范例:mysqldump -uroot -p test student>C:\student.sql
备份多个数据库
语法格式:mysqldump -u username -P --databases dbname1 dbname2 ... > filename.sql
范例:mysqldump -u root -p --databases test mysql>C:\testandmysql.sql
注意事项:加上“--databases”参数后,必须指定至少一个数据库名称,多个数据库名称之间用空格隔开
备份所有数据库
语法格式:mysqldump -u username -P --all-databases>filename.sql
范例:mysqldump -u root -p --all-databases > C:\all.sql
注意事项:使用“--all-databases”参数时,不需要指定数据库名称
恢复数据库
语法格式:mysql -u username -P [dbname] < filename.sql
参数说明:username 表示用户名称;dbname 表示数据库名称,该参数是可选参数。如果 filename.sql 文件为 mysqldump 命令创建的包含创建数据库语句的文件,则执行时不需要指定数据库名。如果指定的数据库名不存在将会报错;filename.sql 表示备份文件的名称
范例:mysql -u root -p < C:\all.sql
注意事项:如果使用--all-databases参数备份了所有的数据库,那么恢复时不需要指定数据库。因为,其对应的 sql 文件中含有 CREATE DATABASE 语句,可以通过该语句创建数据库。创建数据库之后,可以执行 sql 文件中的 USE 语句选择数据库,然后在数据库中创建表并且插入记录
SELECTI...INTO OUTFILE导出表数据
1、使用show variables like '%secure%';语句查看 secure-file-priv 变量配置
secure_file_priv 的值指定的是 MySQL 导入导出文件的路径
如果 secure_file_priv 值为 NULL,则为禁止导出。可以在 MySQL 安装路径下的 my.ini 文件中添加secure_file_priv=设置路径语句,然后重启服务即可
2、语法格式:SELECT 列名 FROM table [WHERE 语句] INTO OUTFILE '目标文件'[OPTIONS]
参数说明:目标文件用来指定将查询的记录导出到哪个文件[OPTIONS] 为可选参数选项,OPTIONS 部分的语法包括 FIELDS 和 LINES 子句,其常用的取值有:FIELDS TERMINATED BY '字符串':设置字符串为字段之间的分隔符,可以为单个或多个字符,默认情况下为制表符‘\t’。FIELDS [OPTIONALLY] ENCLOSED BY '字符':设置字符来括上 CHAR、VARCHAR 和 TEXT 等字符型字段。如果使用了 OPTIONALLY 则只能用来括上 CHAR 和 VARCHAR 等字符型字段。FIELDS ESCAPED BY '字符':设置如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值为‘\’。LINES STARTING BY '字符串':设置每行开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。LINES TERMINATED BY '字符串':设置每行结尾的字符,可以为单个或多个字符,默认值为‘\n’ 。 注意:FIELDS 和 LINES 两个子句都是自选的,但是如果两个都被指定了,FIELDS 必须位于 LINES的前面
范例1:SELECT * FROM test.person INTO OUTFILE 'C://ProgramData/MySQL/MySQL Server 5.7/Uploads/person.txt';
范例2:SELECT * FROM test.person INTO OUTFILE 'C:/person.txt' FIELDS TERMINATED BY '\、' OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY '\-' TERMINATED BY '\r\n';
FIELDS TERMINATED BY '、’: 表示字段之间用、分隔
ENCLOSED BY '\"': 表示每个字段都用双引号括起来
LINES STARTING BY '\-': 表示每行以-开头
TERMINATED BY '\r\n' 表示每行以回车换行符结尾,保证每一条记录占一行
数据库恢复LOAD DATA
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/ Uploads/file.txt' INTO TABLE test_db.tb_students_copy FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '?';
日志
二进制日志(变更日志):该日志文件会以二进制的形式记录数据库的各种操作,但不记录查询语句
查看二进制日志是否开启:SHOW VARIABLES LIKE 'log_bin'
开启二进制日志,格式如下:log-bin=dir/[filename]dir 参数指定二进制文件的存储路径;filename 参数指定二进制文件的文件名,其形式为 filename.number,number 的形式为 000001、000002 等范例:#配置二进制日志存放目录log_bin=E:/135_MySql_5729/mysql-5.7.29-winx64/logs/binary_log/mysql-bin server-id = 1
查看有哪些二进制文件语句:SHOW binary logs;
查看当前正在写入的二进制日志文件SHOW master status;
查看二进制文件内容
语法格式如下:mysqlbinlog 命令的语法形式如下:mysqlbinlog filename.number
范例:mysqlbinlog E:\135_MySql_5729\mysql-5.7.29-winx64\logs\binary_log\mysql-bin.000001
注意事项:实际工作中,二进制日志文件与数据库的数据文件不放在同一块硬盘上,这样即使数据文件所在的硬盘被破坏,也可以使用另一块硬盘上的二进制日志来恢复数据库文件
删除二进制文件
删除所有二进制日志 RESET MASTER;
根据编号删除二进制日志PURGE MASTER LOGS TO 'filename.number';该语句将删除编号小于 filename.number 的所有二进制日志
根据创建时间删除二进制日志PURGE MASTER LOGS TO 'yyyy-mm-dd hh:MM:ss';
暂时停止二进制日志
使用 SET 语句来暂停/开启二进制日志功能,命令如下:SET SQL_LOG_BIN=0/1;
配置范例:#配置错误日志存放目录log-error=E:/135_MySql_5729/mysql-5.7.29-winx64/logs/error_log/error.txt#配置二进制日志存放目录log_bin=E:/135_MySql_5729/mysql-5.7.29-winx64/logs/binary_log/mysql-bin server-id = 1#定义清除过期日志的时间、二进制日志自动删除的天数。默认值为0,表示不自动删除。当MySql启动或刷新二进制日志时可能删除expire_logs_days=10#定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动(关闭当前文件,重新打开一个新的日志文件)。不能将该变量设置为大于1GB或者小于4096B(字节),其默认值是1GBmax_binlog_size=100M
二进制日志还原数据库
命令格式:mysqlbinlog filename.number | mysql -u root -p
范例:mysqlbinlog mylog.000001 | mysql -u root -pmysqlbinlog mylog.000002 | mysql -u root -pmysqlbinlog mylog.000003 | mysql -u root -pmysqlbinlog mylog.000004 | mysql -u root -p mysqlbinlog E:\135_MySql_5729\mysql-5.7.29-winx64\logs\binary_log\mysql-bin.000001 | mysql -u root -p654321 恢复从哪个点到哪个点的日志mysqlbinlog --no-defaults --start-position="4" --stop-position="1285" E:\Mysql57BinLog\binlog.000006 | mysql -u root -p
注意事项:使用 mysqlbinlog 命令进行还原操作时,必须是编号(number)小的先还原。例如,mylog.000001 必须在 mylog.000002 之前还原。
错误日志(默认开启):该日志文件会记录 MySQL 服务器的启动、关闭和运行错误等信息错误日志中记录的并非全是错误信息,例如 MySQL 如何启动 InnoDB 的表空间文件、如何初始化自己的存储引擎等,这些也记录在错误日志文件中
启动和设置错误日志
默认错误日志存储在 MySQL 数据库的数据文件夹下,通常名称为 hostname.err。其中,hostname 表示 MySQL 服务器的主机名
Mysql配置文件配置错误日志(my.ini)
log-err
log-error=dir/{filename}dir 参数指定错误日志的存储路径;filename 参数指定错误日志的文件名;省略参数时文件名默认为主机名,存放在 Data 目录中
log-error=dir/{filename}
log-warnings
log_warnings 为0, 表示不记录告警信息。log_warnings 为1, 表示告警信息写入错误日志。log_warnings 大于1, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志
log_error_verbosity
QL 5.7.2开始,首选log_error_verbosity系统变量,而不是使用–log-warnings选项或log_warnings系统变量.这个参数从MySQL 8.0.3开始被移除了。参数说明: 1: 错误信息;2: 错误信息和告警信息; 3: 错误信息、告警信息和通知信息
查看错误日志
第一步:SHOW VARIABLES LIKE 'log_error';
第二步:文本文档打开第一步查出来的错误日志即可
删除错误日志
使用 mysqladmin 命令来开启新的错误日志,命令格式如下:mysqladmin -uroot -p flush-logs
通用查询日志:对应数据库表(mysql.general_log)该日志记录 MySQL 服务器的启动和关闭信息、客户端的连接信息、更新、查询数据记录的 SQL 语句等
查看通用查询日志是否开启,命令如下:SHOW VARIABLES LIKE '%general_log%';查看通用查询日志存放位置:show variables like 'log_output';设置通用查询日志存放方式(文件or数据库表or文件和数据库表)set global log_output=file;
如果设置 log_output=table 的话,则日志结果会记录到名为 gengera_log 的表中,这表的默认引擎都是CSV。 如果设置 log_output=file 的话,就需要设置general log的日志文件路径,下一个步会讲到。
启动和设置通用查询日志在 MySQL 中,可以通过在 MySQL 配置文件添加 log 选项来开启通用查询日志,格式如下:[mysqld]log=dir/filenamedir 参数指定通用查询日志的存储路径;filename 参数指定日志的文件名如果不指定存储路径,通用查询日志将默认存储到 MySQL 数据库的数据文件夹下。如果不指定文件名,默认文件名为 hostname.log,其中 hostname 表示主机名。
查看通用日志文件
普通文本文档打开
停止通用查询日志
方式一:配置文件中注释掉,并重启Mysql服务[mysqld]#log=dir/filename
删除通用查询日志
方式二:设置 MySQL 的环境变量 general_log 为关闭状态可以停止该日志,示例如下:SET GLOBAL general_log=off;
方式一:使用 mysqladmin 命令来开启新的通用查询日志。新的通用查询日志会直接覆盖旧的查询日志,不需要再手动删除了。mysqladmin 命令的语法如下:mysqladmin -uroot -p flush-logs注意:如果希望备份旧的通用查询日志,必须先将旧的日志文件拷贝出来或者改名。然后,再执行 mysqladmin 命令
方式二:手工删除或者改名通用查询日志。删除之后需要重新启动 MySQL 服务
配置范例(MySql 5.7.29) #配置通用查询日志存放目录general-log=1general-log-file=E:/135_MySql_5729/mysql-5.7.29-winx64/logs/general_log/mysql-general.log;#配置通用查询日志输出方式(文件Or数据库表Or文件和数据库表)# 如果设置 log_output=table 的话,则日志结果会记录到名为 gengera_log 的表中,这表的默认引擎都是CSV。# 如果设置 log_output=file 的话,就需要设置general log的日志文件路径log-output=FILE
查看日志输出类型:SHOW VARIABLES LIKE '%log_out%';
慢查询日志:对应数据库表(mysql.slow_log)记录执行事件超过指定时间的操作,通过工具分析慢查询日志可以定位 MySQL 服务器性能瓶颈所在如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响
查看慢SQL日志是否开启,命令如下:SHOW VARIABLES LIKE 'slow_query%';
slow_query_log: 慢查询开启状态
slow_query_log_file: 慢查询日志存放的位置(一般设置为 MySQL 的数据存放目录)
long_query_time: 查询超过多少秒才记录
log_queries_not_using_indexes : 把没有索引的sql语句也写入到日志中,尽管这个SQL语句有可能执行得挺快
启动和设置慢SQL查询日志
方式一:配置文件配置log-slow-queries=dir\filenamelong_query_time=n“n”参数是设定的时间值,该值的单位是秒。如果不设置 long_query_time 选项,默认时间为 10 秒
方式二:命令设置SET GLOBAL slow_query_log=ON/OFF;SET GLOBAL long_query_time=n;“n”参数是设定的时间值,该值的单位是秒。如果不设置 long_query_time 选项,默认时间为 10 秒
范例(MySql 5.7.29):#配置慢查询日志#配置是否开启慢查询日志slow_query_log = ON#配置慢查询日志存放路径slow_query_log_file=E:/135_MySql_5729/mysql-5.7.29-winx64/logs/slow_query_log/mysql-slow.log#配置慢查询日志时间阈值,单位是秒。默认是10秒long_query_time = 0.00001#配置把没有索引的sql语句也写入到日志中,尽管这个SQL语句有可能执行得挺快。(基本上不建议开启改功能)#log_queries_not_using_indexes =1
删除慢查询日志
方式一:使用 mysqladmin 命令来删除mysqladmin -uroot -p密码 flush-logs
方式二:手工删除注意:删除之后需要重新启动 MySQL 服务
注意事项: 通用查询日志和慢查询日志都是使用这个命令,使用时一定要注意,一旦执行这个命令,通用查询日志和慢查询日志都只存在新的日志文件中。 如果需要备份旧的慢查询日志文件,必须先将旧的日志改名,然后重启 MySQL 服务或执行 mysqladmin 命令
查看日志输出类型:SHOW VARIABLES LIKE '%log_out%';
性能优化
1、如何定位效率低下的SQL
方式一:开启慢查询日志,通过慢查询日志定位那些执行效率较低的 SQL 语句。
方式二:使用 show processlist 命令查看当前 MySQL 在进行的线程。包括线程的状态、是否锁表等,可以实时地查看 SQL 的 执行情况,同时对一些锁表操作进行优化
ID列一个标识,你要kill一个语句的时候很有用,用命令杀掉此查询 /*/mysqladmin kill 进程号
user列显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句
host列显示这个语句是从哪个ip的哪个端口上发出的。用于追踪出问题语句的用户
db列显示这个进程目前连接的是哪个数据库
command列显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)
time列此这个状态持续的时间,单位是秒
state列显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述。请注意,state只是语句执行中的某一个状态,一个 sql语句,以查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成
Checking table 正在检查数据表(这是自动的)
Closing tables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。 这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中
Connect Out 复制从服务器正在连接主服务器
Copying to tmp table on disk 由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存
Creating tmp table 正在创建临时表以存放部分查询结果
deleting from main table 服务器正在执行多表删除中的第一部分,刚删除第一个表
deleting from reference tables 服务器正在执行多表删除中的第二部分,正在删除其他表的记录
Flushing tables 正在执行FLUSH TABLES,等待其他线程关闭数据表
Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。 MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。 如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效
Locked 被其他查询锁住了
Sending data 正在处理SELECT查询的记录,同时正在把结果发送给客户端
Sorting for group 正在为GROUP BY做排序。Sorting for order 正在为ORDER BY做排序。
Opening tables 这个过程应该会很快,除非受到其他因素的干扰。 例如,在执ALTER TABLE或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。
Removing duplicates 正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。 因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端
Reopen table 获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表
Repair by sorting 修复指令正在排序以创建索引
Repair with keycache 修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些
Searching rows for update 正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了
Sleeping 正在等待客户端发送新请求.
System lock 正在等待取得一个外部的系统锁。 如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁
Upgrading lock INSERT DELAYED正在尝试取得一个锁表以插入新记录
Updating 正在搜索匹配的记录,并且修改它们
User Lock 正在等待GET_LOCK()
Waiting for tables 该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。 以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE
waiting for handler insert INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。 大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。 还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着
info列显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据
方式三:使用explain来了解SQL执行的状态范例:explain select surname,first_name form a,b where a.id=b.id
table显示这一行的数据是关于哪张表的
type这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
possible_keys显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句 中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref显示索引的哪一列被使用了,如果可能的话,是一个常数
rowsMYSQL认为必须检查的用来返回请求数据的行数
ExtraMYSQL如何解析查询的额外信息
Distinct一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not existsMYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
Range checked for each Record(index map:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
Using index列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
Using temporary看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
Where used使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
const表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
eq_ref在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
ref这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
range这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
index这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
ALL这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免
2、如何分析查询语句
3、索引对查询速度的影响
4、优化数据库结构的3种方法
5、提高插入数据的速度
6、优化服务器,提高MySql的运行速度
主从、互为主从、分布式
日常运维
系统变量
查看 MySQL 中所有的全局变量信息SHOW GLOBAL VARIABLES;
查看与当前会话相关的所有会话变量以及全局变量SHOW SESSION VARIABLES;