1. MySQL结构:C/S结构

client/server

MySQL自带的客户端程序:
mysql
mysqladmin
mysqldump

2. MySQL的两种连接方式

1.TCP/IP连接(远程、本地)
mysql -uroot -p -h127.0.0.1
mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock

2.socket连接(仅本地)
mysql -uroot -p -hlocalhost
mysql -uroot -p123(默认连接方式,socket)

  1. 注意:
  2. 1.因为使用TCP/IP连接,需要建立三次握手
  3. 2.不一定-h都是tcp,-hlocalhostsocket连接

3. MySQL实例介绍

  1. 1.什么是实例?<br /> 一个进程 + 多个线程 + 预分配内存空间<br /> 2.多实例?<br /> 多个进程 + 多个线程 + 多个预分配的内存空间
  1. 实例=mysqld后台守护进程+Master Thread +干活的Thread+预分配的内存
  2. 公司=老板+经理+员工+办公室

4. mysqld程序运行原理

4.1 mysqld程序结构

一条SQL语句的执行过程

1.连接层
1)验证用户的合法性
2)提供两种连接方式(TCP/IP socket)
3)建立一个与SQL层交互的线程

2.SQL层
1)接收连接层传来的SQL语句
2)验证语法
3)验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete… grant
4)解析器:解析你的SQL语句,生成多种执行计划
5)优化器:接收解析器传来的多种执行计划,选择最优的一种
6)执行器:将优化器选择出的最优的SQL,执行
6.1 建立一个与存储引擎层 交互的线程
6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
7)如果你的前端有缓存,写缓存
8)记录日志(binlog)

3.存储引擎层
1)接收到SQL层传来的SQL语句
2)与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3)建立一个与SQL层交互的线程

4.2 MySQL的物理结构

  1. MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。

4.3 MySQL的逻辑结构

  1. 库:库名,库属性<br /> 表:元数据+真实数据行<br /> 元数据:列+其它属性(行数+占用空间大小+权限)<br /> 列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)

段:一个表就是一个段,一个段是由多个区组成
区:一个区是由多个页组成
页:在数据库中最小单位,页 16K

分区表:由一个区构成的段就是一张分区表

5. MySQL的多实例

多个进程 + 多个线程 + 多个预分配的内存空间

多套配置文件
1.多套数据目录
2.多个端口
3.多个socket文件
4.多个日志文件

步骤:
1.创建多个数据目录
[root@db01 ~]# mkdir /data/{3307,3308,3309} -p

  1. 2.准备多个配置文件<br /> [root[@db01 ](/db01 ) data]# vim /data/3307/my.cnf <br /> [mysqld]<br /> basedir=/usr/local/mysql<br /> datadir=/data/3307/data<br /> port=3307<br /> socket=/data/3307/mysql.sock<br /> log-error=/data/3307/data/mysql.err<br /> log-bin=/data/3307/data/mysql-bin<br /> server_id=7

  1. [root[@db01 ](/db01 ) data]# vim /data/3308/my.cnf <br /> [mysqld]<br /> basedir=/usr/local/mysql<br /> datadir=/data/3308/data<br /> port=3308<br /> socket=/data/3308/mysql.sock<br /> log-error=/data/3308/data/mysql.err<br /> log-bin=/data/3308/data/mysql-bin<br /> server_id=8

  1. [root[@db01 ](/db01 ) data]# vim /data/3309/my.cnf <br /> [mysqld]<br /> basedir=/usr/local/mysql<br /> datadir=/data/3309/data<br /> port=3309<br /> socket=/data/3309/mysql.sock<br /> log-error=/data/3309/data/mysql.err<br /> log-bin=/data/3309/data/mysql-bin<br /> server_id=9
  2. 3.初始化多套数据目录<br /> 3307:<br /> [root[@db01 ](/db01 ) scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
  3. 3308:<br /> [root[@db01 ](/db01 ) scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
  4. 3309:<br /> [root[@db01 ](/db01 ) scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data
  5. 4.授权<br /> [root[@db01 ](/db01 ) scripts]# chown -R mysql.mysql /data
  6. 5.启动MySQL<br /> [root[@db01 ](/db01 ) scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf & <br /> [root[@db01 ](/db01 ) scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf & <br /> [root[@db01 ](/db01 ) scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &
  7. 6.检查端口<br /> [root[@db01 ](/db01 ) scripts]# netstat -lntup|grep 330 <br /> tcp6 0 0 :::3307 :::* LISTEN 25550/mysqld<br /> tcp6 0 0 :::3308 :::* LISTEN 25722/mysqld<br /> tcp6 0 0 :::3309 :::* LISTEN 25894/mysqld
  8. 7.设置多实例密码<br /> [root[@db01 ](/db01 ) scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307' <br /> [root[@db01 ](/db01 ) scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308' <br /> [root[@db01 ](/db01 ) scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'
  9. 8.验证库连接<br /> [root[@db01 ](/db01 ) scripts]# mysql -uroot -p3307 -S /data/3307/mysql.sock -e "show variables like 'server_id';" <br /> Warning: Using a password on the command line interface can be insecure.<br /> +---------------+-------+<br /> | Variable_name | Value |<br /> +---------------+-------+<br /> | server_id | 7 |<br /> +---------------+-------+
  10. [root[@db01 ](/db01 ) scripts]# mysql -uroot -p3308 -S /data/3308/mysql.sock -e "show variables like 'server_id';" <br /> Warning: Using a password on the command line interface can be insecure.<br /> +---------------+-------+<br /> | Variable_name | Value |<br /> +---------------+-------+<br /> | server_id | 8 |<br /> +---------------+-------+
  11. [root[@db01 ](/db01 ) scripts]# mysql -uroot -p3309 -S /data/3309/mysql.sock -e "show variables like 'server_id';" <br /> Warning: Using a password on the command line interface can be insecure.<br /> +---------------+-------+<br /> | Variable_name | Value |<br /> +---------------+-------+<br /> | server_id | 9 |<br /> +---------------+-------+
  12. 连接的小技巧:<br /> [root[@db01 ](/db01 ) scripts]# vim /usr/bin/mysql3309 <br /> mysql -uroot -p3309 -S /data/3309/mysql.sock<br /> [root[@db01 ](/db01 ) scripts]# vim /usr/bin/mysql3308 <br /> mysql -uroot -p3308 -S /data/3308/mysql.sock<br /> [root[@db01 ](/db01 ) scripts]# vim /usr/bin/mysql3307 <br /> mysql -uroot -p3307 -S /data/3307/mysql.sock
  13. [root[@db01 ](/db01 ) scripts]# chmod +x /usr/bin/mysql*