一、mysql结构
1.实例
1.什么是单实例 一个进程 + 多个线程 + 一个预分配的内存空间 2.多实例 多个进程 + 多个线程 + 多个预分配的内存空间
](http://shelldon.51vip.biz/wp-content/uploads/2020/08/wp_editor_md_c66556dcea1b5deb2a0823741f3f2c27.jpg)
2.mysql程序结构
1)连接层
1.验证用户身份 2.提供两种连接方式 3.与sql层建立线程
2)sql层
1.接收连接层发过来的sql语句 2.判断sql的语法 3.判断sql的语义 4.解析器:解析sql语句,生成执行计划 5.优化器:选择最优执行计划 6.执行器:执行选择出来的计划,SQL 6.1 与存储引擎层建立交互,将sql语句传给存储引擎层 6.2 将存储引擎层传来的数据以表格的形式展示出来 7.将数据写入缓存 8.记录日志
3)存储引擎层
1.与sql层建立交互,接收sql层传来sql语句 2.与磁盘建立交互,获取数据
3.mysql逻辑结构
1.库:库的下面全是表 2.表:元数据 + 真实数据行 3.元数据:列 + 其它属性(行数+占用空间大小+权限) 4.列:列名字 + 数据类型 + 其他约束(非空、唯一、主键、非负数、自增长、默认值)
4.mysql物理结构
1.MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。 2.存储引擎分为很多种类(Linux中的FS) 3.不同存储引擎的区别:存储方式、安全性、性能 #数据库创建时,不论库名还是表名,尽量都用小写字母
5.mysql物理大小
1.段:理论上一个表就是一个段,由多个区构成,(分区表是一个分区一个段) 2.区:连续的多个页构成 3.页:最小的数据存储单元,默认是16k 4.分区表:一个区构成一张段,就是一张表
二、mysql的多实例
#mysql 多实例,也是多个配置文件启动数据库 mysql多个配置文件: 1.多个端口 2.多个socket文件 3.多个日志文件 4.多个srver_id 5.多个数据目录
1.创建多实例目录
创建多实例的时候只需要,指定basedir为最原先安装的路径就好了,可以在任何文件夹下创建多实例目录,注意权限对数据库启动的影响。
[root@db03 ~]# mkdir /service/{3307,3308,3309} -p
2.编辑配置文件
[root@db03 ~]# vim /service/3307/my.cnf [mysqld] basedir = /service/mysql datadir = /service/3307/data port=3307 socket=/service/3307/mysql.sock server_id=1 log_err=/service/3307/data/mysql.err log_bin=/service/3307/data/mysql-bin [root@db03 ~]# vim /service/3308/my.cnf [mysqld] basedir = /service/mysql datadir = /service/3308/data port=3308 socket=/service/3308/mysql.sock server_id=2 log_err=/service/3308/data/mysql.err log_bin=/service/3308/data/mysql-bin [root@db03 ~]# vim /service/3309/my.cnf [mysqld] basedir = /service/mysql datadir = /service/3309/data port=3309 socket=/service/3309/mysql.sock server_id=3 log_err=/service/3309/data/mysql.err log_bin=/service/3309/data/mysql-bin
3.初识化多实例数据目录
[root@db03 scripts]# ./mysql_install_db --defaults-file=/service/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/service/3307/data [root@db03 scripts]# ./mysql_install_db --defaults-file=/service/3308/my.cnf --user=mysql --basedir=/service/mysql --datadir=/service/3308/data [root@db03 scripts]# ./mysql_install_db .cnf --user=mysql --basedir=/service/mysql --datadir=/service/3309/data
4.授权目录
[root@db03 service]# chown -R mysql.mysql /service/
5.启动多实例
注意在多实例的启动过程中会消耗比较多的内存。
[root@db03 service]# mysqld_safe --defaults-file=/service/3309/my.cnf & [root@db03 service]# mysqld_safe --defaults-file=/service/3308/my.cnf & [root@db03 service]# mysqld_safe --defaults-file=/service/3307/my.cnf &
6.连接多实例并验证
[root@db03 service]# mysql -S /service/3308/mysql.sock -e "show variables like 'server_id'" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ [root@db03 service]# mysql -S /service/3309/mysql.sock -e "show variables like 'server_id'" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 3 | +---------------+-------+ [root@db03 service]# mysql -S /service/3307/mysql.sock -e "show variables like 'server_id'" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+
7.mysql多实例设置密码
[root@db03 service]# mysqladmin -S /service/3307/mysql.sock -uroot password '123' Warning: Using a password on the command line interface can be insecure. [root@db03 service]# mysqladmin -S /service/3308/mysql.sock -uroot password '123' Warning: Using a password on the command line interface can be insecure. [root@db03 service]# mysqladmin -S /service/3309/mysql.sock -uroot password '123' Warning: Using a password on the command line interface can be insecure.
8.设置密码后连接
使用tcp/ip 的连接会产生一个反向解析的问题。可以在配置文件中设置跳过反向解析,或者直接使用socket的方式去连接。如果使用localhost去连接会报错因为他会去找默认socket文件的位置,mysql多实例配置文件的socket的文件是我们自己指定的位置会出现找不到的情况。
[root@db03 service]# mysql -S /service/3307/mysql.sock -uroot -p Enter password: # 简单连接方式 [root@db03 service]# cat /usr/bin/mysql3307 mysql -S /service/3307/mysql.sock -uroot -p123 [root@db03 service]# cat /usr/bin/mysql3308 mysql -S /service/3308/mysql.sock -uroot -p123 [root@db03 service]# cat /usr/bin/mysql3309 mysql -S /service/3309/mysql.sock -uroot -p123 [root@db03 service]# chmod +x /usr/bin/mysql33*
三、数据库多实例主从复制
1.主库操作
1.开启binlog [root@db03 service]# vim /service/3307/my.cnf [mysqld] basedir = /service/mysql datadir = /service/3307/data port=3307 socket=/service/3307/mysql.sock server_id=1 log_err=/service/3307/data/mysql.err log_bin=/service/3307/data/mysql-bin 2.主库授权一个用户,给从库用来连接 mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123'; Query OK, 0 rows affected (0.18 sec) 3.主库查看binlog信息 mysql> show master status; +------------------+----------+ | File | Position | +------------------+----------+ | mysql-bin.000004 | 120 | +------------------+----------+ 1 row in set (0.00 sec)
2.从库的操作
#从库需要知道的主库信息 主库的IP 连接主库用的用户和密码 binlog信息
1.配置主从 change master to master_host='172.16.1.53', master_user='rep', master_password='123', master_log_file='mysql-bin.000004', master_log_pos=120, master_port=3307; 1.开启IO线程和sql线程 mysql> start slave; Query OK, 0 rows affected (0.08 sec)
3.IO线程不为YES
IO线程的功能主要就是去拉取bin_log中的操作,然后再自己的数据库上面执行来达到同步的目的。
1.测试网络 [root@db03 ~]# ping 172.16.1.53 2.测试端口 [root@db03 ~]# telnet 172.16.1.53 3307 3.测试主库授权的用户登录 [root@db03 ~]# mysql -urep -p123 -h172.16.1.53 -P3307 4.反向解析 [root@db03 service]# vim /service/3307/my.cnf skip-name-resolve 5.UUID相同 克隆的时候,uuid相同会导致配置数据库主从复制的问题。 [root@db03 ~]# cat /service/3307/data/auto.cnf [auto] server-uuid=527f6221-c286-11ea-9ca7-000c29e19d84
4.SQL线程不为YES
在从库上创建了数据库,会导致这个问题。
1.主库有数据,从库没有 2.从库有数据,主库没有 # 主从数据库数据不一致