Nginx的基本功能和工作原理 DB,DataBase
–数据库:依照某种数据模型进行组织并存放到存储器的数据集合
DBMS,DataBase ManaGement System
–数据库管理系统:用来操纵和管理数据库的大型服务软件
DBs,DataBase System
–数据库系统:即DB+DBMS ,指带有数据库并整合了数据库管理软件的计算机系统
常见的服务器软件
MySQL数据库介绍
–起源与发展过程
–最为著名,应用最广泛的开源数据软件
-最早隶属于瑞典的MySQL AB公司
-2008年1月,MySQL AB被Sun收购
-2009年4月, Sun被Oracle收购
崭新的开源分支 MsriaDB
-为应付M有可能会闭源的风险而诞生
-由MySQL原作者Widenius 主导开发
-与MySQL保持最大程度兼容
MySQL的特点及应用
主要特点
-适用于中小规模,关系型数据库系统
-支持Linux ,Windows 等多种操作系统
-使用C和C++编写,可移植性强
-通过API支持Pythen/Java/Perl/PHP 等语言
应用环境
–LAMP平台,与ApacheHTTP Server组合
–LNMP平台,与Nginx组合
安装MySQL基本需求
-1.采用RHEL7.4系统搭建MySQL服务器
-2.关闭防火服务
-3.关闭selinux
-4.软件 mysql-5.7.17-1
数据存储流程
客户端把数据存储到服务器上的步骤
-连接数据库服务器
-建库
-建表
-插入记录
-断开连接
初始配置
主配置文件: /etc/my.cnf
日志文件 : /var/log/mysqld.log
socket文件: /var/lib/mysql/mysql.sock
PID号文件: /var/run/mysqld/mysqld.pid
数据目录的位置: /var/lib/mysql
进程所有者和组 : mysql.mysql
数据目录所有者和组: mysql.mysql
端口号: 3306
服务脚本为 :/usr/lib/systemd/system/mysqld.service
首次登陆密码: grep password /var/log/mysqld.log
设置新密码: alter user root@“localhost” identified by “123qqq…A”;
列出所有密码的表: show variables like “%password%”;
修改密码难度: set global validate_password_policy=0;
修改密码长度:set global validate_password_length=6;
设置密码:alter user root@“localhost” identified by “123456”;
[root@localhost ~]#mysqladmin -uroot -p旧密码 password”新密码”
恢复mysql管理密码
1.停止mysql服务程序
2.跳过授权表启动mysql服务程序
–skip-grant-tables 写入/etc/my.cnf配置文件
3.重设root密码(更新user表记录)
4.以正常方式重启mysql服务程序
–updata mysql.user set authentication_string=password(“新密码”)
Where user=“root” and host=“localhost”;
–flush privileges;
永久设置
vim /etc/my.cnf
[mysqld]
plugin-load=validate_password.so //加载模块
validate-password=FORCE_PLUS_PERMANENT //永久启用模块
validate_password_policy=0 //只验证密码长度
validate_password_length=6 //指定密码长度
库管理命令
–show databases ; //显示已有的库
–use 库名; //切换库
–select database(); //显示当前所在的库
–create database 库名; //创建新库
–show tables; //显示已有的表
–drop database 库名; //删除库
数据库的命名规则
-可以使用数字/字母/下划线,但不能纯数字
-区分大小写,具有唯一性
-不可使用指令关键子,特殊字符
表管理命令
–create table 库名。表名(字段名1 字段类型(宽度) 约束条件 ); //创建表
–desc 表名; //查看表结构
–select * from 表名; //查看表记录
–drop table 表名; //删除表
–insert into 表名 values(值列表); //插入表记录
–update 表名 set 字段=值; //修改表记录
–delete from 表名; //删除表记录
mysql 数据类型
常见的信息种类
数值类型 : 整数型, 浮点型 | 数值型:体重,身高,成绩,工资
字符类型 | 姓名 ,工作单位,通信地址
日期时间类型:时间函数 | 出生日期 ,注册时间
枚举类型 | 兴趣爱好,性别
字符类型
定长:char(字符数)
–最大长度255字符
–不够指定字符数时在右边用空格补齐
–字符数段超出时,无法写入数据
变长:varchar(字符数)
–按数据实际大小分配存储空间
–字符数段超出时,无法写入数据
大文本类型:text/blob
–字符数大于65535存储时使用
日期时间,datetime
–占用8个字节
–范围:1000-01-01 00:00:00.000000~9999-12-31 23:59:59.999999
日期时间 ,timestamp
–占用4个字节
–范围:1970-01-01 00:00:00.000000~2038-01-19 03:14:07.999999
日期
–占用4个字符
–范围:0001-01-01 ~ 9999-12-31
年份,year
–占用1个字节
–范围:1901-2155
时间,time
–占用3个字节
–格式:hh:mm:ss
关于日期时间字段
–当未给timestamp字段赋值时,以系统当前时间赋值,而datetime字段默认值为NULL
year年份
–默认用4位数字表示
–当只用2位数字赋值时,
01~69视为2001~2069
70~99视为1970~1999
select 可以输出函数;
枚举类型
从给定值集合中选择单个值,enum
–定义格式:enum()
从给定值集合中选择一个或多个值,set
–定义格式:set()
约束条件
–Null 允许为空,默认设置
–NOT NULL 不允许为空
–key 索引类型
–Default 设置默认值,却省为NULL
修改表结构:alter table 表名 执行动作;
执行动作:
–add 添加字段
–modify 修改字段类型
–change 修改字段类型
–drop 删除字段
–rename 修改表名
添加新字段;
alter table 表名 add 字段名 类型(宽度) 约束条件;
可加after 字段名;
或者 first;
修改字段类型:
alter table 表名 modify 字段名 类型(宽度) 约束条件;
可加 after 字段名;
或者first;
修改字段名:
alter table 表名 change 源字段名 新字段名 类型(宽度) 约束条件
删除字段:
alter table 表名 drop 字段名;
修改表名:
alter table 表名 -rename 新表名;
索引介绍;
–索引是对记录集的多个字段进行排序的方法
–类似于书的目录
–索引类型包括:Btree,B+tree,hash
索引优缺点
优点:
–通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
–可以加快数据的检索速度
缺点:
–当对表中的数据进行增加,删除和修改的时候,索引也要动态维护,降低了数据的维护速度
–索引需要占用物理空间
键值类型
–index:普通索引
–unique:唯一索引
–felltext:全文索引
–primary key:主键
–foreign key:外键
主键注意事项:
–一个表中只能有一个primary key字段
–对应的字段值不允许有重复,且不允许赋NULL值
–如果有多个字段都作为Prinary key,称为复合主键,必须一起创建
–主键字段的KEY标志是PRI
–通常与aotu_increment 连用
–经常把表中能狗唯一标识记录的字敦设置为主键字段【记录编号字段】
建表的时候指定主键字段:
create table 表名(id int(4) aotu_increment,
name varchar(4) not null ,age int(2) noit null,primary key(id));
在已有的表中设置primary key :
alter table 表名 add primary key(字段名);
移除表中的primary key :
alter table 表名 modify id int(4) not NULL;
alter table 表名 drop primary key;
什么是外键?
–让当前表字段的值在另一个表中字段值范围内选择
使用外键的条件:
–表的存储引擎必须是innodb
–字段类型要一致
–被参照字段必须要是索引类型的一种(primary key)
基本用法:
–foreign key(表A的字段名)
references 表(字段)
on update cascade
on delete cascade
删除外键字段:alter table 表名 drop foreign key 约束名;
约束名查找:show create 表名\G
mysql 存储引擎
作为可插拔试的组件提供
–mysql服务软件自带的功能程序,处理表的处理器
–不同的存储引擎有不同的功能和数据存储方式
默认的存储引擎
–mysql 5.0/5.1 —> myisam
–mysql 5.5/5.6 —> innodb
列出可用的存储引擎类型:
–show engines;或
–show engines\G
建表时手动指定引擎,未指定,使用默认引擎
建表时指定表中引擎:create table 表名(id int(4)) engine=innodb;
修改/etc/my.cnf
–default-storage-engine=存储引擎名称
myisam 存储引擎
主要特点:
–支持表级锁
–不支持事务,事务回滚,外键
相关的表文件
–表名.frm
–表名.MYI
–表名.MYD
innodb存储引擎
主要特点
–支持行级锁定
–支持事务,事务回滚,外键
相关的表文件
–表名.frm
–表名.ibd
–ibdata1
–ib_logfile0
–ib_logfiel1
mysql 锁机制
锁力度
–表级锁:一次直接对整张表进行加锁
–行级锁:只锁定某一行
–页级锁:对整个页面(mysql管理数据的基本存储单位)进行加锁
锁类型
–读锁(共享锁):支持并发读
–写锁(互斥锁,排它锁):是独占锁,上锁期间其他线程不能读表或写表
查看当前的锁状态:show status like ‘table lock%’;
事务特性:
Atomic:原子性
–事务的整个操作是一个整体,不可分割,要么全部成功,要么全部失败。、
Consistency:一致性
–事务操作的前后,表中的记录没有改变
Isolation:隔离性
–事务操作是相互隔离不接受影响的。
Durability:持久性
–数据一旦提交,不可改变,永久改变表数据
show variables like “autocommit”; //查看提交状态
set autocommit=off; //关闭自动提交
rollback; //数据回滚
commit; //提交数据
查看默认使用目录及目录是否存在:
show variables like “secure_file_priv”;
[root@client ~]# ls -ld /var/lib/mysql-files/
修改目录及查看修改结果:
[root@client ~]# mkdir /myload
[root@client ~]# chown mysql /myload
[root@client ~]# vim /etc/my.cnf
secure_file_priv=/mydir
[root@client ~]# systemctl restart mysqld
mysql> show variables like “secure_filev”;
数据导入
基本用法
–load data infile “目录名/文件名”
into table 表名
fields terminated by “分隔符”
lines terminates by “\n”;
注意事项
–字符分隔符要与文件内的一致
–指定导入文件的绝对路径
–导入数据的表字段类型要与文件字段匹配
–禁用Selinux保护机制
数据导出
基本用法
–SQL查询 into outfile “目录名/文件名”
fields terminated by “分隔符”
lines terminates by “\n”;
注意事项
–导出的内容由SQL查询语句决定
–导出的是表中的记录,不包括字段名
–禁用Selinux
增加表记录
语法格式
格式1:添加1条记录,给所有字段赋值
–insert into 表名 values (字段值列表);
格式2:添加N条记录,给所有字段赋值
–insert into 表名 values (),(),()
格式3:添加1条记录,给指定字段赋值
–insert into 表名(字段名列表)values(字段值范围)
格式4:添加N条记录,给指定字段赋值
–insert into 表名(字段值列表)valuse(),(),()
注意事项
–字段值要与字段类型匹配
–对于字符类型的字段,要用双或单引号括起来
–依次给所有字段赋值时,字段名可以省略
–只给一部分字段赋值时,必须明确写出对应的字段名称
数值,字符 /比较/匹配空/非空
= 等于
, >= 大于,大于或等于
< , <= 小于,小于或等于
!= 不等于
IS NULL 匹配空
IS NOT NULL 非空
逻辑匹配
多个判断条件时使用
OR 逻辑或
AND 逻辑与
! 逻辑非
() 提高优先级
范围内匹配/去重显示
匹配范围内的人一一个值即可
in 在…里…
not in 不在…里…
between数字1 and 数字2 在…之间…
distinct 字段名 去重显示
模糊查询
基本用法
–where 字段名 like ‘通配符’
– _匹配单个字符 % 匹配 0~N个字符
正则表达式
基本用法
–where 字段名 regexp ‘正则表达式’
–正则元字符 ^ $ . [] * |
四则运算
运算操作:字段必须是数值类型
聚集函数
mysql内置数据统计函数
–avg (字段名) //统计字段平均值
–sum(字段名) //统计字段之和
–min(字段名) //统计字段最小值
–max(字段名) //统计字段最大值
–count(字段名) //统计字段值个数
查询结果排序:–sql查询 order by 字段名 [asc|desc];
查询结果分组:–sql查询 group by 字段名 ;
查询结果过滤:
–sql查询 having 条件表达式;
–sql查询 where 条件 having 条件表达式;
–sql查询 group by 字段名 having 条件表达式;
限制查询结果显示行署:
–sql查询 limit N; //显示查询结果前N条记录
–sql查询 limit N,M; //显示指定范围内的查询结果
–sql查询 where 条件查询 limit 3; //显示查询结果前3条记录
–sql查询 shere 条件查询 limit 3,3; //从第4条开始,共显示3条
将源表xxx复制为新表yyy
–create table yyy select * from xxx;
将指定的查询结果复制为新表zzz
–create table zzz sql查询语句
复制源表xxx的结构到新表vvv
–create table vvv select * from xxx where false;
将源表vvv的名称改为www
–alter table vvv rename to www;
多表查询,也称为连接查询
–将2个或多个以上的表按某个条件连接起来。从中选取需要的数据
–当多个表种存在相同的意义的字段(字段名可以不相同)时,可以通过
字段连接多个表
格式1
–select 字段名列表 from 表a,表b;
格式2
–select 字段名列表 from 表a,表b where 条件;
Where子查询
使用where子查询
–把内层查询结果作为外查询的查询条件
语法格式
–select 字段名列表 from 表名 where 条件 (select 字段名列表 from 表名 where 条件);
左连接查询
基本用法
–select 字段名列表 from 表a left join 表b on 条件表达式;
右连接查询
基本用法
–select 字段名列表 夫人哦名表a fight join 表b on 条件表达式;
常见的mysql管理工具
phpMyAdmin
基本思路
1.安装httpd,mysql,php-mysql及相关包
2.启动Httpd服务程序
3.解压phpmyadmin包,部署到网站目录
4.配置config.inc.php,指定mysql主机地址
5.创建授权用户
6.浏览器访问,登陆使用
mysql授权库和表信息
…授权库mysql,主要的几个表
–user表,存储授权用户的访问权限
–db 表,存储授权用户对数据库的访问权限
–tables_priv 表,存储授权用户对表的访问权限
–columns_priv表,存储授权用户对字段的访问权限
基本用法
–grant 权限列表 on 库名.表名 to 用户名@“客户段地址”
identified by ‘新密码’
[with grant option]; //是否有授权权限
注意事项
–当库名.表名 为 . 时,匹配所有库所有表,
–当权限列表为 all 时,匹配所有权限
–当客户端地址为 % 时,匹配所以地址
–授权设置存放在mysql库的user表
用户查看自己的权限
–show grants;
管理员查看其他用户的权限
–show grants for 用户名@‘客户端地址’
授权用户连接后修改密码
–set password=password(“新密码”)
管理员重置授权用户密码
–set password for 用户名@‘客户端地址’=password(“新密码”)
撤销用户权限
–revoke 权限列表 on 库名.表名 from 用户名@“客户端地址”
数据备份方式
物理备份
–冷备:cp , tar ,… …
逻辑备份
–mysqldump
–mysql
备份策略
完全备份
–备份所有数据
增量备份
–备份上次备份后,所有新产生的数据
差异备份
–备份完全备份后,所有新产生的数据
物理备份缺点
–跨平台行差
–备份时间长,冗余备份,浪费存储空间
mysqldump备份缺点
–效率较低,备份和还原速度慢
–备份过程中,数据插入和更新操作会被挂起
物理备份及恢复
备份操作
–cp -rp /var/lib/mysql/数据库 备份目录/文件名
–tar -zcvf xxx.tar.gz /var/lib/mysql/数据库/*
恢复操作
–cp -rp 备份目录/文件名 /var/lib/mysql/
–tar -zvxf xxx.tar.gz -C /var/lib/mysql/数据库名/
逻辑备份及恢复
备份操作: mysqldump -uroot -p密码 库名 > 路径/xxx.sql
恢复操作: mysql -uroot -p密码 库名 < 路径/xxx.sql
库名表示方式
– --all-databases 或 -A 所有库
– 数据库名 单个表
– 数据库名 表名 单个表
– -B 数据库1 数据库2 多个库
注意:无论备份还是恢复,都要验证用户权限
binlog日志概述
二进制日志用途及配置方式
采用binlog日志的好处
–记录除查询之外的sql命令
–可用于数据恢复
–配置mysql主从同步的必要条件
– vim /etc/my.cnf
log_bin= //启用binlog日至
server_id= //指定id值
binlog相关文件
–主机名-binindex //记录已有日志文件名
–主机名-bin.000001 //第一个二进制日志
–主机名-bin.000002 //第二个二进制日志
– … …
清理binlog日志
删除早于指定版本的binlog日志
–purge master logs to “binlog文件名”;
删除所有的binlog日志,重新建日志
–reset master;
查看日志当前记录格式
–show variables like “binlog_format”
修改日志格式
[root@localhost~]#vim /etc/my.cnf
binlog_format=“mixed”
使用mysqlbinlog工具
–格式:mysqlbinlog [选项] binlog日志文件名
常用选项
– --start-datetime=“yyyy-mm-dd hh:mm:ss”
– --stop-datetime=“yyyy-mm-dd hh:mm:ss”
– --start-position=数字
– --stop-position=数字
应用示例:查看从2014年1月2日15:30开始的更改操作
#mysqlbinlog --start-datetime=“2014-01-02 15:30” /var/lib/mysql/mysql-bin.000001
利用binlog恢复数据
基本思路
–使用 mysqlbinlog 提取历史sql操作
–通过管道交给mysql命令执行
应用示例:执行第一份binlog所记录的更改操作
#cd /var/lib/mysql
#mysqlbinlog mysql-bin.000001 | mysql -uroot -p123456
innobackupex基本选项
–database=“库名” //单个库
–database=“库1 库2” //多个库
–database=“库.表” //单个表
应用示例:将所有库完全备份到/backup
#innobackupex --user root --password 123456 /backup --no-timestamp
//完全备份
#innobackupes --user root --password 123456 --apply-log /backup
//准备恢复数据
#systemctl stop mysqld
#rm -rf /var/lib/mysql //恢复时要求空的库目录
#mkdir /var/lib/mysql
#innobackupex --user root -password 123456 --copy-back /backup
//恢复数据
#chown -R mysql:mysql /var/lib/mysql /加权限
#systemclt restart mysqld
增量备份与恢复数据
-增量备份首先要完全备份,在增量备份
#innobackupex --user root --password 123456 --databases =”库名列表”
/fullbak --no-timestamp //完全备份
#innobackupex --user root --password 123456 --databases=”库名列表”
–incremental /new1 --incremental-basedir=”fullbak” --no-timestamp
///第一次增量备份
#innobackupex --user root --password 123456 --databases=”库名列表”
–incremental /new2 --incremental-basedir=”new2” --no-timestamp
///第二次增量备份
恢复
#rm -rf /var/lib/mysql/*
#innobackupex --user root --password 123456 --databases=”库名列表”
–apply-log --redo-only /fullbak //完整恢复
#innobackupex --user root --password 123456 --databases=”库名列表”
–apply-log --redo-only /fullbak --incremental-dir=”nuw1” //恢复增量
#innobackupex --user root --password 123456 --databases=”库名列表”
–apply-log --redo-only /fullbak --incremental-dir=”nuw2” //恢复增量
#innobackupex --user root --password 123456 --databases=”库名列表”
–copy-back /fullbak //拷贝文件
完全备份中恢复单个表
#innobackupex --user root --password 123456 --databases =”gamedb”
/fullbak --no-timestamp //先备份
#innobackupex --user root --password 123456 --databases =”gamedb”
–apply-log --export /fullbak //导出表信息
create table gamedb.a(id int); //创建表
alter table gamedb.a discard tablespace; //删除表空间
system cp /fallbak/gamedb/a.{idb,cfg,exp} /var/lib/musql/gamedb
//拷贝表信息文件
system chown mysql:mysql /vae/lib/mysql/gamedb/a.*
alter table gamedb.a import tablespace; //导入表空间
select * from gamedb.a;
mysql 主从同步
主从同步原理
master,记录数据更改操作
–启用binlog日志
–设置binlog日志格式
–设置server_id
slave 运行2个线程
–slave_io:复制master主机,binlog日志文件里的sql到
本机的relay-log文件里
–slave_sql:执行本机relay-log文件里的sql语句,
重现master的数据操作
基本构建思路
确保数据相同
–从库必须要有主库上的数据
配置主服务器
–启用binlog日志,授权用户,查看当前正使用的日志
配置从服务器
–设置server_id,指定主库信息
测试配置
–客户端连接主库写入数据,在从库上也能查询到
确保数据一致
master 服务器
–应包括希望同步的所有库
–对采用myisam的库,可离线备份
slave服务器
–离线导入由master提供的备份
–清空同名库
配置主服务器
调整运行参数–启用binlog及允许同步
#vim /etc/my.cnf
log_bin=日志名 //启用binlog日志
server_id=id值 //指定服务器id号
binlog_format=“mixed” //指定日志格式
授权用户
–允许replicater从4.0网段访问
–对所有库(默认不允许对单个库)有同步权限
grant replication slave on . to repluser@"%";
identified by “密码”;
show master status\G; //查看master状态
配置从服务器
调整运行参数–指定server_id,不允许与主库相同
#vim /etc/my.cnf
server_id=id值 //指定服务器id,然后重启服务
指定主库信息
change master to
master_host=“192.168.4.10”, //主库ip地址
master_user=“repluser”, //主库授权用户
master_password=“123456”, //授权用户密码
master_log_file=“mysql51.000001” //日志文件
master_log_pos=334; //偏移位置
start slave;
以后要更改master信息时,应先stop slave;
show slave status\G; //查看slave状态,确保io,sql线程都已运行
Slave_IO_Running : Yes //IO线程已运行
Slave_SQL_Running : Yes //SQL线程已运行
相关文件:
适用于master服务器
适用于slave服务器
复制模式介绍
异步复制
–主库执行完一次事务后,立即将结果返给客户端,并不关心从库
是否已经接收并处理
全同步模式
–当主库执行完一次事务,且所有从库都执行该事务后才返回给客户端
半同步复制
–介于异步复制和全同步复制之间
–主库在执行完一次事务后,等待至少一个从库接受到并写到relay log
中才返回给客户端
show variables like ‘have_dynamic_logding’;
//查看是否允许加载模块 ,默认允许
命令行加载插件
–用户需要super权限
install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
//主库上执行
install plugin rpl_semi_sync_slave soname ‘semisync_master.so’;
//从库上执行
select plugin_name,plugin_status from information_schema.plugin
Where plugin_name like “%semi%”; //查看
启用半同步复制:在安装完插件后,半同步复制默认时关闭的
set global rpl_semi_sync_master_enabled=1; //主库上执行
set global rpl_semi_sync_slave_enabled=1; //从库上执行
show variables like ‘rpl_semi_sync_%_enabled’; //查看
永久启用半同步复制
–需要修改到主配置文件 /etc/my.cnf
–添加相关设置到[mysqld] 部分
//主库的配置
Plugin-load=rpl_semi_sync_master=semisync_masyer.so
rpl__semi_sync_master_enabled=1
//从库上配置
Plugin-load=rpl_semi_sync_slave=semisync_masyer.so
rpl__semi_sync_slave_enabled=1
//即做主库也作从库
plugin-load=“rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
读写分离原理
多台mysql服务器
–分别提供读,写服务,均衡流量
–通过主从复制保持数据一致性
由mysql代理面向客户端
–收到sql写请求时,交给服务器A处理
–受到sql读请求时,交给服务器B处理
–具体区分策略由服务设置
由mysql的兄弟公司mariadb开发
下载地址:https://downloads.mariadb.com/files/MaxScale
部署maxscale服务
–修改配置文件/etc/maxsxale.cnf
9 [maxscale] #定义服务启动线程的数量
10 threads=auto
[server1] //定义数据库服务器主机名
Type=server
Address=192.168.4.10 //master主机ip地址
Port=3306
Protocol=MySQLBackend
[MySQL Monitor] #定义监控的数据库服务器
37 type=monitor
38 module=mysqlmon
39 servers=server1, server2 //服务器列表
40 user=scalemon //用户名
41 passwd=123qqq…A //密码
42 monitor_interval=10000
[Read-Only Service] #不定义只读服务
54 #type=service
55 #router=readconnroute
56 #servers=server1
57 #user=myuser
58 #passwd=mypwd
59 #router_options=slave
64 [Read-Write Service] #定义读写分离服务
65 type=service
66 router=readwritesplit
67 servers=server1, server2 #数据库服务器列表
68 user=maxscale #用户
69 passwd=123qqq…A #密码
70 max_slave_connections=100%
76 [MaxAdmin Service] 定义管理服务
77 type=service
78 router=cli
86 #[Read-Only Listener] 不定义只读服务
87 #type=listener
88 #service=Read-Only Service
89 #protocol=MySQLClient
90 #port=4008
92 [Read-Write Listener] #定义读写分离服务使用的端口
93 type=listener
94 service=Read-Write Service
95 protocol=MySQLClient
96 port=4006
98 [MaxAdmin Listener] #定义管理服务使用的端口
99 type=listener
100 service=MaxAdmin Service
101 protocol=maxscaled
102 socket=default
103 port=4016
在主从数据库服务器创建授权用户
grant replication slave,replication client on . to 监控用户@”%”
Identified by “密码”; //创建监控用户
grant select on mysql.* to 路由用户@”%” identified by “密码”;
//创建路由用户
grant all on . to 访问用户@”%” identified by “密码”;
//创建访问数据用户
主要操作:启动服务,查看端口,停止服务
#,maxscale --config=/etc/maxscale.cnf
#kill -9 进程号
连接管理端口:maxadmin -uadmin -pmariadb -P端口
访问maxscale代理: mysql -h服务器地址 -P端口 -u用户名 -p密码
select @@hostname; //查看当前主机名
多实例概述
什么时多实例?
–在一台物理主机上运行多个数据库服务器
为什么要使用多实例?
–节约运维成本
–提高硬件利用率
配置步骤
1) 安装支持多实例服务的软件
2) 修改主配置文件
3) 初始化授权库
4) 启动服务
5) 客户端访问测试
1、停止其他软件提供的MySQL服务
2、安装提供多实例服务的MySQL软件包
#tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
#mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
3、创建主配置文件
vim /etc/my.cnf
[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user=root
[mysqld1]
datadir=/datadir3307
socket=/datadir3307/mysql3307.sock
port=3307
log-error=/datadir3307/mysqld3307.log
pid-file=/datadir3307/mysqld3307.pid
[mysqld2]
datadir=/datadir3308
socket=/datadir3308/mysql3308.sock
port=3308
log-error=/datadir3308/mysqld3308.log
pid-file=/datadir3308/mysqld3308.pid
:wq
[root@client50 mysql]# mkdir /datadir3307
[root@client50 mysql]# mkdir /datadir3308
4、启动多实例服务 并查看端口
#/usr/local/mysql/bin/mysqld_multi start 1
最后1行会显示 首次登录密码
5、访问多实例服务
-S /datadir3307/mysql3307.sock
修改登录密码
alter user root@“localhost” identified by “123456”; //使用修改后的密码登录
#/usr/local/mysql/bin/mysql -uroot -p123456
-S /datadir3307/mysql3307.sock //建库 建表
l> show databases;
l> create database db2;
exit
6 启动多实例服务
MHA简介
–由日本DeNA公司youshimatin开发
–是一套优秀的实现mysql高可用的解决方案
–数据库的自动故障切换操作能做到在0~30秒之内
–MHA能确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用
MHA组成
MHA Manager (管理节点)
–可以单独部署在一台独立的机器上。管理其他节点
–也可以部署在一台slave节点上
MHA Node(数据节点)
–运行在每台mysql服务器上
工作过程
–由Manager定时探测集群中的马斯图尔节点
–当master故障时,Manager自动将拥有最新数据的slave提升为新的master
关键点
1) 从宕机崩溃的master保存二进制日志事件
2) 识别含有最新更新的slave
3) 应用差异的中继日志(rely log) 到其他的slave
4) 应用从master保存的二进制日志事件
5) 提升一个slave为新的master
6) 使其他的slave连接到新的master进行复制
在所有的数据节点上授权监控用户
grant all on . to root@”%” identified by “123456”;
相关命令
set global relay_log_purge=off //不自动删除本机的中继日志文件
.1 在管理主机上创建管理命令
#cd mha4mysql-manager-0.56/bin
#cp * /root/bin/
2 创建主配置 并编辑
#cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha/
#vim /etc/mha/app1.cnf
[server default] #服务默认配置
manager_workdir=/etc/mha #工作目录
manager_log=/etc/mha/manager.log #日志文件
#故障切换脚本
master_ip_failover_script=/etc/mha/master_ip_failover
#ssh服务用户名及端口
ssh_user=root
ssh_port=22
#主从复制时,从库连接主库的用户名及密码
repl_user=repluser
repl_password=123qqq…A
#监控数据库时,连接服务器的用户及密码
user=root
password=123qqq…A
#监控数据库时,连接服务器的用户及密码
user=root
password=123qqq…A
指定数据库服务器ip及角色
[server1]
hostname=192.168.4.10
candidate_master=1
35 my $vip = ‘192.168.4.100/24’; # Virtual IP
把脚本中指定的ip地址手动部署在当前主库51 上。
启动服务
1) 检查ssh连接:masterha_check_ssh --conf=/etc/mha/app1.cnf
//[info] All SSH connection tests passed successfully.
2) 检查主从同步配置:masterha_check_repl --conf=/etc/mha/app1.cnf
//MySQL Replication Health is OK.
3)启动管理服务:masterha_manager --conf=/etc/mha/app1.cnf
–remove_dead_master_conf --ignore_last_failover //
4)查看状态:masterha_check_status --conf=/etc/mha/app1.cnf
//app1 (pid:9541) is running(0:PING_OK), master:192.168.4.61
5)测试配置:
在客户端主机上连接vip 192.168.4.100 访问数据库服务
坏掉
停止服务:masterha_stop --conf=/etc/mha/app1.cnf
什么是视图?
–虚拟表
–内容与真实的相似,有字段有记录
–视图并不在数据库中以存储的数据形成存在
–行与列的数据来自定义视图时查询所引用的基表,
并且在具体引用视图时动态生成
–更新视图数据,就是更新基表的数据
–更新基表数据,视图的数据也会跟着改变
视图优点:
简单:
–用户不需要关心视图中的数据如何查询获得
–视图中的数据已经是过滤好的符合条件的结果集
安全:
–用户只能看到视图中的数据
数据独立:
–一旦视图结构确定,可以屏蔽表结构对用户的影响
视图使用权限
不能在视图上创建索引
在视图的from子句中不能使用子查询
以下情形中视图是不可能更新的:
–包括以下关键字的SQL语句:聚合函数(SUM,MINMAX,COUNT等),DISTINCT,
GROUP BY ,HAVING,UNION或UNION ALL
–常量视图,join,from 一个不能更新的视图
–where 子句的子查询引用了from子句中的表
–使用了临时表
语法格式:创建视图
create view 视图名称 as sql查询;
create view 视图名称(字段名列表) as sql查询;
查看当前库下所有表的状态信息
–show table status;
–show table status where comment=”view”\G; //视图表
查看创建视图表的具体命令
–show create view 视图名;
使用视图:
查询视图–select 字段名列表 from 视图名 where 条件;
插入记录–insert into 视图名(字段名列表) values(字段值列表);
更新视图–update 视图名 set 字段名=值 where 条件;
删除记录–delete from 视图名 where 条件;
删除视图–drop view 视图名;
设置字段别名
–视图中的字段名不可以重复,所以要定义别名–create view 视图名 as select 表别名.源字段名 as 字段别名 from 源表名 表别名 left join 源表名 表别名 on 条件;
重要选项:
Or replace
create or replace view 视图名 as select 查询;
–创建时,若视图已存在,会替换已有的视图
–local 仅检查当前视图的限制
–cascaded 同时要满足基表的限制(默认值)
存储过程介绍
–存储过程,相当于是mysql语句组成的脚本
–指的是数据库中保存的一系列sql命令的集合
–可以在存储过程中使用变量,条件判断,流程控制等
存储过程优点
–提高性能
–可减轻网络负担
–可以防止对表的直接访问
–避免重复编写sql操作
创建存储过程语法格式:
delimiter //用来指定存储过程中的分隔符(默认;)
create procedure 名称()
begin
…功能代码
end
// //结束存储过程
delimiter ;
查看存储过程:
方法1:>show procedure status;
方法2:>select db,name,type from mysql.proc where name=”存储过程名”
调用存储过程
–call 存储过程名();
删除存储过程
–drop procedure 存储过程名;
变量类型:
show global variables; //查看全局变量
show session variables; //查看会话变量
set session sort_buffer_size = 40000; //设置会话变量
show session variables like “sort_buffer_size” //查看会话变量
show global variables like “%关键字%”; //查看全局变量
set @y = 3; //用户自定义变量,直接赋值
select max(uid) into @y from user ; //使用sql命令查询结果赋值
参数类型
调用参数时,名称前也不需要加@
–create procedure 名称(类型 参数名 数据类型)
存储过程参数的使用
算法运算:运算符号及用法示例
set @x=1;set @y=2;set @z=@x*@y;select @z; //用法
条件测试;数值的比较
逻辑比较,范围,空,非空,模糊,正则
选泽结构:if 条件判断 end if;
循环结构: while 条件判断 end while;
–loop死循环:无条件,反复执行某一段代码
Loop 循环体 end loop;
–repeat条件式循环:当条件成立时结束循环
Repeat 循环体 … until 条件判断 end repeat;
控制循环的执行
–leave 标签名 //跳出循环
–iterate 标签名 //放弃本次循环,执行下一次循环
什么是分库分表?
–将存放在一个数据库(主机)中的数据,按照特定方式进行拆分,分散存放到多个数据库(主机)中,以达到分散单台设备负载效果
垂直分割
纵向切分
–将单个表,拆分成多个表,分散到不同的数据库
–将单个表数据库的多个表进行分类,按业务类别分散到不同的数据库上
水平分割
横向切分
–按照表中某个字段的某种规则,把表中的许多记录按行切分,分散到多个数据库中
Mycat介绍
Mycat是基于java的分布式数据库系统中间层,为高并发环境的分布式访问提供解决方案
–支持JDBC形式连接
–支持MYSQL,Oracle,Sqlserver,Mongodb等
–提供数据读写分离服务
–可以实现数据库服务器的高可用
–提供数据分片服务
–基于阿里巴巴Cobar进行研发的开原软件
–适合数据大量写入数据的存储需求
工作过程
当mycat收到一个sql查询时
–先解析这个sql查询涉及到的表
–然后看此表的定义,如果有分片规则,则获取sql里的分片字段的值,并匹配分片函数
,获得分片列表
–然后将sql发往这些分片去执行
–最后收集和处理所有分片结果数据,并返回到客户端
修改配置文件
目录结构说明
–bin //mycat命令,如启动 停止 等
–catlet //扩展功能
–conf //配置文件
–lib //mycat使用的jar
–log //mycat启用日志和运行日志
–wrapper.log //mycat服务启动日志
–mycat.log //记录sql脚本执行后的报错内容
重要配置文件说明
–server.xml //设置连mycat的帐号信息
–schema.xml //配置mycat的真实库表
–rule.xml //定义mycat分片规则
配置标签说明
– … //定义连mycat用户信息
– … … //指定数据节点
– … … //指定数据库地址及用户信息
修改配置文件:/usr/local/mycat/conf/server.xml
//连mycat的用户名
test //对应密码
true //定义只读
修改配置文件:/usr/local/mycat/conf/schema.xml //定义分片信息
修改数据库的配置文件 #vim /etc/my.cnf
–添加对应设置后重启mysql服务 lower_case_table_names = 1 //表名忽略大小写
–添加授权用户 //grant all on . to admin@”%” identified by “123456”
–创建存储数据对应的库
指定java路径,添加PATH路径,启动服务
在客户端连接mycat服务器进行测试
–mysql -h 服务器地址 -P 端口 -u用户名 -p密码