MySQL产品
当年Sun公司买下了MySQL,后来Sun公司被Oracle收购了。也就是MySQL也变成Oracle的了。Oracle向来视MySQL为眼中钉,所以Oracle在收购Sun的时候遭到了欧盟的极力反对,他们担心MySQL。Oracle有前科的,对于自己的产品,有竞争对手的,把对方公司收购,在把产品打入冷宫,不卖了。Oracle当前做出承诺,5年内花人力物力研发MySQL。Oracle也的确这么做了,但是MySQL有两个版本:社区版和商业版。在Oracle收购Sun之后,在不到两年的时间,商业版价格翻了4倍。好在Oracle在收购Sun的时候还收购了一个Openoffice的组件,是Linux上的一个办公套件。Oracle收购之后第一件事,就是openoffice不再开源,开始收钱了。很遗憾的是,Oracle毙掉之后,大家不认账,没人买他的。后来,openoffice那个团队又在早期的openoffice基础上做了另外一套office叫Libreoffice,比openoffice还要好,依然开源。没过多久,Oracle把openoffice又开源了,但是没人在用了。所以不知道MySQL会不会面临这个命运。MySQL的原作者当前在Oracle收购Sun时就极力反对,在Sun被收购后,他又组织了当年的开源团队,在早期MySQL的基础上重新创建了另外一套叫做MariaDB。MariaDB开源,并且其在设计上比早期的MySQL更先进。而且其API和MySQL完全兼容,所以Redhat7不再附带MySQL,而是MariaDB。现在MySQL家族的产品主要有:
- MySQL Server(mysqld、mysql)
- MySQL Cluster
- MySQL Proxy
- MySQL Adminitrator
- MySQL Query Browser
- MySQL Workbench
- MySQL Migration Toolkit
- MySQL Embedded Server
- MySQL Drivers and Connectors
MySQL Server:分为企业级DB和社区版DB。
MySQL Cluster:市面上几乎没有使用这种企业级集群。
MySQL Proxy:由代理来判断谁能被读,谁能被写。
对于我们来说,会用到MySQL Server、MySQL Proxy和MySQL Drivers and Connectors。
MySQL逻辑架构
MySQL是个多用户服务器,支持多个连接同时连接进来。可以通过线程池来定义最多可以有多少个用户同时连进来。多余的连接请求放在连接队列中,线程池里出去一个,就从队列里进去线程池一个。据说oracle为mysql的商业版引入了很强大的线程池机制。连接/线程处理是MySQL的重要组成部分。
用户请求接进来以后,如果是个select语句,先查询缓存(mysql缓存是根据查询语句的hash码对比的,select的大小写都会导致hash码不一样)。如果命中,直接返回结果,如果未命中,接下来分析器做语句分析,分析之后缓存中还有可能命中。所以分析器分析后仍然要去查缓存。如果缓存还是未命中,接下来交给优化器,优化以后由执行引擎交给存储引擎做查询操作。
优化器优化之后,真正负责执行语句的是存储引擎。mysql是插件式存储引擎的,所以不同的表可以使用不同的存储引擎。
MySQL逻辑组件
Connection Pool:Authentication, Thread Reuse, Connection Limits, Check Memory, Caches。
认证,线程重用, 连接限制, 检查内存, 实现连接缓存。
存储引擎将数据转换成存储在文件系统中的文件,文件系统可以是NTFS、ufs、ext2/3、NFS、SAN、NAS。文件系统上的文件表现为文件和日志。文件有数据文件和索引文件。日志有重做、撤销、二进制、错误、查询和慢查询日志,一般不涉及撤销日志,所以这边日志有5种。
备份工具、安全工具、恢复工具复制工具、集群工具等。
用户请求接进来了,连接管理器负责接收用户请求,接进来后,线程管理器需要生成一个线程响应用户请求(MySQL是单进程多线程模型的),用户输入了帐号和密码后,需要一个用户模块,用户肯定需要和用户模块打交道的,因为需要认证。只要连接进来,后续的sql语句也是和用户模块打交道,而不会和连接管理器打交道了。
用户认证后,会发出很多SQL命令,由命令派发器来派发给查询缓存,查询缓存如果命中了则直接返回结果,当然完成了就需要记录日志(记录日志是可选步骤)。如果查询缓存没命中,就要交给分析器分析了。用户的语句有DDL、DML,分析结束后,如果是select就交给优化器,如果是update、insert、delete、replace就交给表修改模块,如果是repair就交给表维护模块,如果是replication类操作就交给复制模块,还需要个状态报告模块报告服务器执行状态。
这些组件最终由访问控制模块来控制,你到底有没有权限来操作,这个模块是做访问检查的。前面那个用户模块是做认证检查的,帐号密码没问题不代表可以访问里面的数据。访问控制模块检查没问题后,接下来就真正执行操作了。表管理器接口的真正执行的操作依赖于存储引擎。所以接下来要交给存储引擎的抽象接口。存储引擎抽象接口将用户请求在转发给各存储引擎。
MySQL安装部署
1.MySQL的安装方式
- 源码编译
- rpm包:
- OS Vendor提供的
- MySQL官方提供的
- 通用二进制格式
2.MySQL版本
- GA(General Availability):要选择GA版
- RC(Release Candidate):候选版,马上要发布为GA版本
- beta:公测版
- alpha:内测版
3.MySQL官方提供的rpm包
- MySQL-devel:开发需要的头文件和额外的库文件。
- MySQL-embedded:嵌入式环境下专用的。
- MySQL-ndb-management:MySQL集群管理器。
- MySQL-shared:被各种应用程序所依赖的贡献库。
- MySQL-shared-compat:兼容库。有些老的应用程序可能依赖mysql老版本的库。
- MySQL-test:测试套件。包含一些压测工具等等。
- MySQL-VERSION.PLATFORM.src.rpm:源代码包。
对我们而言,需要MySQL-client、MySQL-server、MySQL-shared、MySQL-shared-compat和MySQL-test。
4.二进制方式部署MySQL 5.6
下载地址:http://mirrors.sohu.com/mysql
主机名 | 操作系统版本 | IP地址 | 安装软件 |
---|---|---|---|
console | CentOS 7.0 | 114.55.29.246 | mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz |
(1)安装依赖包
[root@console local]# yum install libaio* -y
(2)解压安装
[root@console local]# tar zxf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz
[root@console local]# ln -sv mysql-5.6.27-linux-glibc2.5-x86_64 mysql
‘mysql’ -> ‘mysql-5.6.27-linux-glibc2.5-x86_64’
(3)新建用户
运行mysql最好不要用root去运行,而以普通用户身份。添加用户mysql。
[root@console local]# groupadd -r -g 300 mysql
[root@console local]# useradd -g mysql -r -s /sbin/nologin -u 300 mysql
[root@console local]# id mysql
uid=300(mysql) gid=300(mysql) groups=300(mysql)
(4)修改mysql文件权限为mysql.mysql
[root@console local]# cd mysql
[root@console mysql]# chown -R mysql.mysql ./*
(5)执行初始化操作,生成一个系统库叫mysql,它里面保存着有当前所有能够使用mysql服务器的用户帐号、所有数据库的名字、每个库中表的名字、表中字段的名字等等。
脚本路径:/usr/local/mysql/scripts
创建数据文件目录:
[root@console mysql]# mkdir -pv /data/{mydata,binlog}
[root@console mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mydata
[root@console mysql]# ls /data/mydata
(6)修改mysql目录下的文件属主为root,属组为mysql
[root@console mysql]# chown -R root .
(7)修改data目录属主、属组为mysql
[root@console mysql]# chown -R mysql.mysql /data
(8)拷贝修改mysql的配置文件
copy写好的my.cnf到/etc/目录下。
(9)拷贝mysql的启动脚本,并加入系统服务
[root@console mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@console mysql]# chkconfig --add mysqld
(10)启动mysql
[root@console mysql]# service mysqld start
(11)配置环境变量,配置完重新打开一个shell
[root@console mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
(12)修改root密码,因为一装完root密码是空的
[root@console ~]# mysql -uroot mysql
mysql> UPDATE user SET Password=PASSWORD('wisedu123') where USER='root';
mysql> FLUSH PRIVILEGES;
此时再以root登录就需要密码了。
(13)删除两个匿名帐号
mysql> use mysql
mysql> SELECT host,user,password FROM user;
mysql> DROP USER ''@localhost; #注意’’@localhost是两个单引号
mysql> DROP USER ''@console;
MySQL初始化
MySQL是基于TCP的3306端口。虽然如此,但是还支持其他的通信方式,比如socket、memory、pipe。tcp是远程通信时用的,Linux或unix本机是基于socket,windows本机是基于memory或pipe。
MySQL服务器无论是通用二进制方式安装还是编译的方式安装,安装完成后要做MySQL的初始化。系统初始化时,默认库是mysql。这个库存储了当前mysql的各种元数据。这些初始化包含以下工作:
提供配置文件
配置文件:.cnf结尾
- 集中式的配置:多个应用程序共用的配置文件
- [mysqld]
- [mysqld_safe]
- [client]
使用配置文件的方式(安装mysql的方式不同,读取配置文件的顺序可能不同)
- 1.它依次查找每个需要查找的文件,结果是所有文件并集;
- 2.如果某参数在多个文件中出现多次,后读取的最终生效;
配置文件顺序:
# /usr/local/mysql/bin/mysqld --help --verbose | head -20
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
删除所有匿名用户(5.7之前的版本)
mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'www.abc.com'; #www.abc.com为主机名
用户帐号由两部分组成:username@host,host指所能够远程访问时使用的客户端主机
host还可以使用通配符:
- %: 任意长度的任意字符
- _: 匹配任意单个字符
给所有的root用户设定密码(5.7之前的版本)
1.第一种方式
mysql> SET PASSWORD FOR username@host = PASSWORD('your_passwrod');
2.第二种方式
mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root'; ——这是修改授权表
mysql> FLUSH PRIVILEGES; ——通知mysqld重读授权表
3.第三种方式: 命令行mysqladmin工具
# mysqladmin -uUserName -hHost password 'new_password' -p ——这里的host指mysqld服务器的ip,并不是帐号中的主机地址
# mysqladmin -uUserName -hHost -p flush-privileges
客户端工具
mysql, mysqladmin, mysqldump, mysqlcheck, mysqlimport
配置文件中[client]下面的配置是所有mysql客户端共享的配置
命令行客户端的通用的选项:
- -u, –user=
- -h, –host=
- -p, –password=
- –protocol={tcp|socket|memory|pipe}
- –port=
- –socket= 例如:/tmp/mysql.sock
非客户端类的管理工具:myisamchk, myisampack。 都是在mysql服务器上运行的,不能基于客户端服务器端通信方式进行使用的。myisamchk是检测工具,检测myisam表是不是有不一致的情况。myisampack是打包压缩工具。
mysql客户端
mysql这个命令行客户端工作模式:
- 交互式模式 mysql>
- 脚本模式(批处理模式) mysql < /path/to/mysql_script.sql
1.mysql交互式模式
(1)客户端命令:
mysql> help ——获取客户端命令帮助
mysql> \? ——获取客户端命令帮助
\c
\g
\G
\q
\!
\s
\. /path/to/mysql_script.sql
当然,客户端命令里面偶尔可能还会用到其他的,比如”rehash (#) Rebuild completion hash.”,MySQL其实也支持命令补全的,比如说你有一个库叫mysql,或者叫其他的库,等会我们去use设定某个默认库时,或者只要但凡用到库名的时候,你可以不用写全了,它可以自动给你补全。但是这一功能在mysql启动时默认是关闭的,因为要想能够实现此种功能意义上的补全,需要让mysql服务器启动时读取每一个mysql对象并且给它们生成一个hash表才能补全。这通常会导致mysql启动时被卡住,尤其是非常大的mysql数据库时。启动后如果想用补全,就使用#,重新生成补全的hash表的hash码。
(2)服务器端命令:需要把命令写全后一并发送给服务器端执行的,因此需要命令结束符,默认为分号(;)
2.mysql的快捷键
- Ctrl + w: 删除光标之前的单词
- Ctrl + u: 删除光标之前至命令行首的所有内容
- Ctrl + y: 粘贴使用Ctrl+w或Ctrl+u删除的内容
- Ctrl + a: 移动光标至行首
- Ctrl + e: 移动光标至行尾
mysqldmin工具
mysqladmin [options] command [arg] [command [arg]] ...
command:
- create DB_NAME
- drop DB_NAME
- debug: 打开调试日志并记录于error log中;如果我们启动mysql总是出错的话,你可以使用mysqladmin debug,它可以限定通知mysql服务器运行过程中的所有信息都送往mysql的error log。
- status:显示mysql运行的简要状态信息
- –sleep #: 指定间隔时长刷新状态信息
- –count #: 显示的批次,显示几次。
- extended-status: 输出mysqld的各状态变量及其值,相当于执行“mysql> SHOW GLOBAL STATUS”
- variables: 输出mysqld的各服务器变量
- flush-hosts: 清空主机相关的缓存:DNS解析缓存,此前因为连接错误次数过多而被拒绝访问mysqld的主机列表。如果我们在某台客户端主机上连服务器,mysql默认好像是10次,在有限时间内错误过多可能就被放到黑名单中去了。此后再发连接请求,直接拒绝。一旦出现这种情况,就得去mysql服务器端flush-hosts。
- flush-logs: 日志滚动,只二进制日志和中继日志。
- refresh: 相当于同时使用flush-logs和flush-hosts
- flush-privileges: 通知服务器重读授权表。
- reload: 功能同flush-privileges。
- flush-status: 重置服务器状态变量的值。重置extended-status显示的变量值,不是所有变量。
- flush-tables: 关闭当前打开的表文件句柄。
- flush-threads:清空线程缓存。
- kill: 给线程id,杀死指定的线程,可以一次杀死多个线程,以逗号分隔,但不能有多余空格。mysql是单进程多线程的。
- password: 修改当前用户的密码。
- ping: 探测服务器是否在线。
- processlist:显示mysql服务器的线程列表。
- shutdown: 关闭mysqld进程。所以mysqladmin是个很危险的命令。
- start-slave
- stop-slave: 启动/关闭从服务器线程
- version:显示mysqld的版本。
【示例】:
[root@osb30 ~]# mysqladmin -uroot -p create testdb
Enter password:
[root@osb30 ~]# mysqladmin -uroot -p status
Enter password:
Uptime: 15116890 Threads: 23 Questions: 144580431 Slow queries: 12904887 Opens: 380 Flush tables: 1 Open tables: 338 Queries per second avg: 9.564
[root@osb30 ~]# mysqladmin -uroot -p version
Enter password:
mysqladmin Ver 8.42 Distrib 5.6.27, for Linux on x86_64
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.6.27
Protocol version 10
...
[root@osb30 ~]# mysqladmin -uroot -p ping
Enter password:
mysqld is alive
GUI客户端工具:
- Navicat for mysql 商业版的
- Toad for mysql
- mysql front 商业版的
- sqlyog 商业版的
- phpMyAdmin 基于php的开源工具
mysql忘记root密码怎么办
在my.cnf文件中加入如下配置:
skip-grant-tables=1
然后用空密码方式使用root用户登录 MySQL:
mysql -u root
修改root用户的密码:
mysql> update mysql.user set password=PASSWORD('newpassword') where User='root';
mysql> flush privileges;
mysql> quit