数据库知识
数据库第一天 4
两台服务器4.50与4.51 4
常见软件: 4
Mysql数据类型: 5
Mysql管理环境 7
常用的SQL命令分类 7
表管理命令: 8
记录管理 8
枚举类型 11
时间函数的应用: 12
数据库第二天 13
约束条件: 13
修改表结构: 15
更改表字段类型 16
更改总表名 17
键值: 17
Primary key 复合主键: 20
删除主键 22
数据库第三天 24
搜索路径 24
数据库导入 25
数据的导出 26
管理表记录 27
匹配条件 28
高级匹配条件:(适用于 select/update/delete) 30
四则运算:+ - * / %取余 ()提高优先级 31
聚集函数: 32
限制查询结果显示行数: 33
数据库第四天 35
Grant授权: 35
授权库: 37
Root密码: 38
数据的备份: 39
完全备份: 40
binlog日志 41
差异备份: 43
分析日志: 44
数据库第五天 45
Mysql备份工具 45
1 安装percona软件 45
增量恢复: 46
恢复数据 47
删除单张表: 48
数据库进阶一天 50
主从同步: 50
4 主从同步扩展 52
配置主主结构:( 把数据库服务器192.168.4.56 和 53
数据库进阶第二天 55
数据读写分离: 55
Maxscale服务: 55
部署maxscale服务 57
配置多实例: 58
数据库进阶第三天 61
分库分表: 61
**重要配置文件说明: 63
创建连接用户: 63
数据库进阶第四天 65
部署MHA集群 65
MHA集群环境 66
管理集群命令: 67
创建故障切换脚本 68
启动管理服务 69
数据库进阶第五天 70
MHA 70
PXC集群 70
管理员登录查看状态: 72
列出可用的存储引擎: 73
Mysql锁机制 74
事务特征(ACID): 74
数据库NOSQL第一天 76
RDBMS软件: 76
部署Redis服务: 76
常用命令: 77
优化设置: 79
连接密码: 80
部署LNMP+Redis: 80
配置php支持redis 81
测试配置 82
数据库NOSQL第二天 84
Redis-trib脚本用法: 84
创建集群: 84
管理服务器设备创建集群 86
查看集群信息: 86
访问集群 87
4. 添加服务器 87
在管理主机,查看集群新消息 89
5. 添加slave角色主机到集群里 90
在管理主机,添加slave角色主机 91
移除服务器 91
数据库NOSQL第三天 93
配置主从复制: 93
配置master 93
配置哨兵服务: 94
RDB: 94
AOF 95
优化配置: 96
数据类型分类 97
数据库第一天
准备环境
两台服务器4.50与4.51
[stud@room9mysql]$scp mysql-5.7.17.tar [email protected]:/root/
mysql-community-server-5.7.17-1.el7.x86_64.rpm
mysql-community-client-5.7.17-1.el7.x86_64.rpm
[root@1 ~]# tar -xf mysql-5.7.17.tar //解包
[root@1 ~]# yum -y install mysql-community-.rpm
//安装数据库相应软件包rdbms软件,部署redis服务,常用命令,优化设置,连接密码,部署LNMP+Redis
[root@1 ~]# systemctl start mysqld
[root@1 ~]# systemctl enable mysqld
[root@1 ~]# systemctl status mysqld
[root@1 ~]# netstat -anput | grep 3306
tcp6 0 0 :::3306 ::: LISTEN 23419/mysqld
常见软件:
关系型:oracle mysql sql server db2 开源2跨平台
非关系型:redis memcache mongodb
数据库 默认端口:3306
主配置文件: /etc/my.cnf
错误日志文件: /var/log/mysqld.log
数据库目录: /var/lib/mysql
进程名:mysqld
传输协议:TCP协议
进程所有者:mysql 进程所有组:mysql
数据库信息刷新:flush privileges;
数据库密码默认长度为8 最短长度4
切换概要库:use informarion_schema
切换授权库:use mysql
切换性能结构库:use performancr_schema
切换系统元数据库:use sys;
Mysql数据类型:
定长char
变长varchar
整数型
浮点型
日期时间类型
枚举类型
[root@1 ~]# grep password /var/log/mysqld.log
2019-10-08T02:30:49.705931Z 1 [Note] A temporary password is generated for root@localhost: W1Cjw1uhvo=1
[root@1 ~]# mysql -hlocalhost -uroot -p’W1Cjw1uhvo=1’
//生成随机密码,进入mysql
mysql> alter user root@“localhost” identified by ‘123qqq…A’;
mysql> show databases;
//重新设置数据库密码
mysql> show variables like “%password%”; //查看密码变量
mysql> set global validate_password_policy=0;
//修改密码策略
mysql> set global validate_password_length=6;
//修改密码长度
mysql> alter user root@localhost identified by ‘123456’;
//直接命令行生效非永久
[root@1 ~]# vim /etc/my.cnf 永久生效(主配文件)
[mysqld]
validate_password_policy=0
validate_password_length=6
[root@1 ~]# systemctl restart mysqld
[root@1 ~]# mysql -hlocalhost -uroot -p123456
mysql> use mysql; //使用mysql库
mysql> show tables; //查看mysql表
Mysql管理环境
SQL命令不区分字母大小写;
每条SQL以;结束
默认命令不支持TAB自动补齐.
/c 终止sql命令;
常用的SQL命令分类
1.DDl 数据定义语言 如:create alter drop
2.DML数据操作语言 如:insert update delete
3.DCL 数据控制语言 如:grant revoke
4.DTL 数据事物语言 如:commit rollback savepoint
库管理命令:
库名 命名规则
仅可以使用数字.字母.下划线.不能纯数字
区分字母大小写,具有唯一性
不可使用指令关键字.特殊字符
mysql> show databases; //显示所有的库
mysql> select user(); //显示连接用户
mysql> use 库名; //切换库
mysql> select database(); //显示当前所在的库
mysql> create database 库名 //创建新库
mysql> show tables; //显示已有的表
mysql> drop database 库名 //删除库
表管理命令:
Desc 库名.表名;
Drop table 库名.表名;
Mysql>create table 库名.表名(字段名1 类型 (宽度)
字段名2 类型(宽度),…) default charset=utf8; (中文必备)
mysql> create database db1; //创建db1库
mysql>create table db1.studinfo
( name char(15),homeaddr char(20));
//创建表在db1库中两个字符字段表头name与homeaddr
mysql> use db1; //使用db1表
mysql>show tables; //查看db1库的表
mysql> desc db1.studinfo; //查看db1库的表结构
记录管理
Select * from 库名.表名; /查看表记录
Insert into 库名.表名 values(值); /插入表记录
Update 库名.表名 set 字段=值 /修改表记录
Delete From 表名; /删除表记录
mysql>insert into db1.studinfo
values (“bob”,“USA”),(“lucy”,“USA”),(“lilei”,“china”);
//写入内容三个括号代表三行分别为两列
mysql> select * from db1.studinfo; //查看表内容
mysql> update db1.studinfo set homeaddr=“bejing”;
//替换二列homeaddr所有都为 beijing
mysql> select * from db1.studinfo; //查看表改后内容
mysql> delete from db1.studinfo; //删除表中内容
mysql> create table 学生信息表(姓名 char(15) , 性别 char(2) ) default charset=utf8;
mysql> show tables;
mysql> insert into db1.学生信息表 values (“张三”,“男”);
mysql> select * from db1.学生信息表;
mysql> create table db1.t1 (class char(7), name char(15), email varchar(30)); //创建t1表 email为变长类型
mysql> show tables;
mysql> desc t1; //查表结构
mysql>insert into db1.t1
values (“nsd1907”,“bob”,“[email protected]”);
//写入内容class,名字,与变长类型邮箱
mysql> select * from db1.t1 //查看表t1
mysql> drop table 学生信息 //删除学生信息表
mysql> create table t3 (name char(10) , age tinyint unsigned ); //创建t3表 名字 指定长度,年龄微小整数无符号范围
mysql> insert into t3 values (“bob”,-11);
ERROR 1264 (22003): Out of range value for column ‘age’ at row 1 //有unsigned不支持负值
mysql> insert into t3 values (“bob”,11); //写入信息
mysql> insert into t3 values (“bob”,256);
ERROR 1264 (22003): Out of range value for column ‘age’ at row 1 //tinyint超出范围
mysql> insert into t3 values (“bob”,255); //写入信息
mysql> select * from t3; //查看t3 表
浮点型类型
mysql> create table t4 (name char(10) ,pay float(5,2) );
//创建浮点型类型 格式:字段名 类型(总个数,小数位数)
mysql> show tables;
mysql> insert into t4 values (“john”,1000);
ERROR 1264 (22003): Out of range value for column ‘pay’ at row 1 //写入浮点型信息 超出pay float(5,2) 范围
mysql> insert into t4 values (“john”,999); //写入信息
mysql> select * from t4; //查看表信息
mysql> insert into t4 values ( “johnA”, 999.12 ); //写入信息
mysql> select * from t4; //查看表信息
日期时间类型
mysql> use db1
mysql> create table t5( name char(10), csnf year, up_time time, birthday date, party datetime);
//创建t5表,五个表头.
mysql> desc t5; //查看表结构
mysql>insert into t5
values (“bob”,2000,083000,20191120,20190101083000);
//写入五个日期字段
mysql> select * from t5; //查看t5表
枚举类型
字段名 enum(值1,值2,值n) /单选
字段名 set(值1,值2,值n) /多选
mysql> create table t6 ( name char(10),
Sex enum(“boy”,“girl”,“noboynogirl”),
likes set (“eat”,“game”,“piao”,“du”));
//创建枚举表头 enum控制多选一 likes set 多选
mysql> desc t6; //查看t6表结构
mysql> insert into t6
values (“alices”,“noboynogirl”,“game,piao”); //写入表信息
mysql> select * from t6; //查看表信息
时间函数的应用:
mysql>use db1;
mysql> show tables;
mysql> select now(); //显示当前系统时间与日期
mysql> select curtime(); //查看当前系统时间
mysql> select curdate(); //查看当前系统日期
mysql> select year(now()); //查看指定时间年
mysql> select month(now()); //查看指定时间月
mysql> select day(now()); //查看指定时间日
mysql> select date(now()); //查看指定时间日期
mysql> select time(now()); //查看指定时间 时间
mysql>insert into t5
values (“tom”,year(now()),curtime(),curdate(),now());
//写入新内容
mysql> create table t7(name char(10),meetting datetime,party timestamp);
//创建t7表 datetime无值为空timestamp无值应用现默认
mysql> desc t7; //查看t7表结构
mysql> insert into db1.t7 values
-> (“bob”,20191009112545,20191009213025);
//写入表内容
mysql> select *from t7;
//查看表信息
mysql> insert into t7(name,meetting) values(“tom”,20191224204558);
//写入两个字段 metting有值,party默认当前时间
mysql>insert into t7(name,party) values(“jim”,20171224204558);
//写入两个字段 metting无值,party有值
mysql> desc t5;
mysql> insert into t5(name ,csnf) values
-> (“john”,21),
-> (“jerry”,71),(“jack”,2071);
mysql> select * from t5;
数据库第二天
约束条件:
Null 允许为空(默认设置)
Not null 不允许为null(空)
Key 键值类型
Default 设置默认值,没有为null
Extra 额外设置
mysql>use db1;
mysql>create table t8(name char(10) not null,
-> age tinyint unsigned default 19,
-> class char(7) not null default “nsd1907”,
-> pay float(7,2) default 28000);
//创建t8表名字为定长10,不能为空,年龄为微整型,无符号默认值19,班级为定长7不能为空默认值nsd1907,支付为浮点型总个数为7,小数位为2默认值为28000.00
mysql> insert into t8(name)values(“bob”);
//使用默认值
mysql> select * from t8; //查看t8表内容
mysql> insert into t8 values(“tom”
-> ,21,“nsd1908”,28888.88);
//不使用默认值
mysql> insert into t8 values (null,28,null,30088);
ERROR 1048 (23000): Column ‘name’ cannot be null
//name字段不能为空
mysql> insert into t8 values (“jerry”,28,null,30088);
ERROR 1048 (23000): Column ‘class’ cannot be null
//class字段不能为空
mysql>insert into t8
values (“jerry”,28,“nsd1907”,30088);
//非空建立表内容
mysql> select * from t8; //查看t8表内容
mysql> create table t9(
-> name char(10) not null,
-> homeaddr char(30) not null default “”);
mysql> desc t9;
mysql> insert into t9 values (“null”,“null”);
mysql> select *from t9;
mysql> insert into t9(name) values (“tom”);
修改表结构:
添加表字段
Alter table 库名.表名 add 字段名 类型 [约束条件after | first]:
mysql> alter table db1.t1
-> add school char(15) not null default “tarena”;
mysql> desc t1;
mysql> alter table db1.t1
-> add age tinyint unsigned default 19 after name;
mysql> desc t1;
mysql> alter table db1.t1
-> add stu_num int first;
mysql> desc t1;
mysql> select *from t1;
更改表字段类型
Alter table 库名.表名 modify 字段名 类型 [约束条件 after | first];
mysql> delete from db1.t1;
mysql> alter table db1.t1
-> modify name varchar(15) not null default “”;
mysql> alter table db1.t1
-> modify name varchar(15) not null default “” after stu_num;
mysql> desc t1;
改变表字段名字
Alter table change 源字段名 新字段名
mysql> alter table db1.t1 change
->stu_num stu_id int;
mysql> alter table db1.t1 change
-> school xuexiao varchar(30) default “tedu”;
mysql> desc t1;
删除表字段
Alter table 库名.表名 drop 字段名;
mysql> alter table db1.t1 drop email;
mysql> alter table db1.t5 drop csnf;
更改总表名
Alter table 表名 rename 新表明;
mysql> alter table t9 rename school;
mysql> show tables;
批量修改表结构
mysql> alter table db1.t1
-> add qq char(11),
-> add phone char(11),
-> modify class char(9),
-> change name user varchar(15) not null default “”,
-> drop xuexiao;
mysql> desc t1;
键值:
键值类型:
Index 普通索引:
一个表中可以有多个index字段
字段值允许重复,可以赋null值
Index字段标志是MUL
Unique 唯一索引
Fulltext 全文索引
Primary key 主键:
一个表中只能有一个primary key主键.
多个字段作为主键,称为复合主键,必须一起创建.
字段值不允许重复,不允许赋null值.
主键标志PRI
主键通常与auto_increment连用
通常设置表中唯一标识的纪录的字段设置为主键
Foreign key 外键
普通索引:
Create index 索引名 on 表名(字段名); /创
Drop index 索引名 on 表名; /删
Show index from 表名 \G; 查索引
mysql> desc t3; //查看t3表结构
mysql> create index name on t3(name);
//给name设置普通索引MUL
mysql> create index age on t3(age);
//给age设置普通索引MUL
mysql> show index from t3 \G;
//显示设置索引详细信息
mysql> desc t3;
mysql> drop index age on t3; //删除age上的索引
mysql> show index from t3 \G;
↓创建新的数据库
mysql> create database db2;
mysql> create table db2.t1(
-> name char(10),
-> age int,
-> sex enum(“boy”,“girl”),
-> index(name),index(sex));
//建立新t1表设置name与sex为普通索引
mysql> desc db2.t1; //查看t1表结构
2)unique ##唯一索引,不允许有重复值,比如身份证,银行账号
3)fulltext ##全文索引,适合在进行模糊查询的时候使用
Primary key主键:
alter table 表名 字段 primary key(字段名列表);
mysql> create table t8(
-> name char(10) primary key,
-> age int,
-> class char(7));
//建立t8表设置name为主键索引
mysql> desc t8; //查看t8表结构
mysql> create table t9(
-> name char(10),age int,class char(7),primary key(name)); //等同t8表
mysql> insert into t9 values (null,19,“nsd1907”);
ERROR 1048 (23000): Column ‘name’ cannot be null
//验证设置主键索引不得为null值
mysql> insert into t9 values (“bob”,19,“nsd1907”);
//在t9写入表内容
mysql> insert into t9 values (“bob”,20,“nsd1908”);
ERROR 1062 (23000): Duplicate entry ‘bob’ for key ‘PRIMARY’
//验证主键索引name不得重复
Primary key 复合主键:
alter table 表名 字段 primary key(多字段名列表);
mysql> create table pay(
-> name char(10),class char(7),
-> pay enum(“yes”,“no”),
-> primary key(name,class,pay));
//创建pay表同时设置复合主键(name,class与pay)验证不得三段重复,依然可以写入.
mysql> desc pay; //查看pay表结构
mysql> insert into db2.pay values (
-> “bob”,“nsd1907”,“yes”);
mysql> insert into db2.pay values (
-> “bob”,“nsd1907”,“no”);
mysql> insert into db2.pay values (
-> “bob”,“nsd1908”,“yes”);
mysql> select *from pay; //查看pay表内容
mysql> insert into db2.pay
values ( “bob”,“nsd1908”,“yes”);
ERROR 1062 (23000): Duplicate entry ‘bob-nsd1908-yes’ for key ‘PRIMARY’
//验证同时三个字段建立报错
主键与auto_increment连用:
mysql> create table db2.t3(
-> id int primary key auto_increment,
-> name char(10),age tinyint unsigned,
-> class char(7) default “nsd1907”);
mysql> desc t3;
mysql> insert into t3(name,age) values(“bob”,19);
mysql> select *from t3;
mysql> insert into t3(name,age) values(“tom”,16);
mysql> insert into t3(name,age) values(“john”,27);
mysql> select *from t3;
mysql> select *from t3 where id=2;
mysql> insert into t3 values(6,“lili”,18,“nsd1906”);
mysql>insert into t3 values(null,“hanmem”,28,“nsd1906”);
mysql> select *from t3;
删除主键
mysql> alter table 库名.表名 drop primary key;
mysql> alter table t3 modify id int not null;
//改变自增长将其去掉
mysql> alter table t3 drop primary key;
//删除主键
添加主键
在已有表里添加主键
Alter table 表名 add primary key(字段名);
创建复合主键
Alter table 表名 add primary key(字段名列表) ;
mysql> alter table db2.pay add primary key(name,class,pay);
mysql> alter table t1 add stu_num tinyint primary key auto_increment first
外键的使用
Create table 表名( 字段名列表,foreign key(字段名) references 表名(字段名) #指定外键 on update cascade #同步更新 on delete cascade #同步删除 )engine=innodb; #指定存储引擎
;
mysql> create table db2.yg(yg_id int primary key auto_increment,yg_name char(10)
-> )engine=innodb;
mysql> insert into db2.yg(yg_name)
-> values(“bob”),(“bob”),(“tom”),(“lili”);
mysql> select *from db2.yg;
mysql> create table db2.gz(
-> gz_id int ,gz float(7,2),
-> foreign key(gz_id) references yg(yg_id)
-> on update cascade on delete cascade
-> )engine=innodb;
mysql> show create table gz \G;
mysql> insert into gz values (1,25000);
mysql> insert into gz values (2,35000);
mysql> insert into gz values (3,45000);
mysql> insert into gz values (4,55000);
mysql> select *from gz;
mysql> update db2.yg set yg_id=8 where yg_id=1;
//单独更改一个字段单个内容
mysql> delete from yg where yg_id=2;
删除外键
mysql> show create table gz\G;
mysql> alter table gz drop foreign key gz_ibfk_1;
数据库第三天
搜索路径
Show variables like “secure_file_priv”; //查看
目录:/var/lib/mysql-files/
数据库导入
Load data infile “目录名/文件名”
Into table 库名.表名
Fields terminated by “分隔符”
Lines terminated by “\n”;
注意事项:字段分隔符要与文件一致
表字段类型和字段个数要与文件匹配
导入数据时指定文件的绝对路径.
#mkdir /myload
#chown mysql /myload
#vim /etc/my.cnf
[mysqld]
Secure_file_priv=”/myload”
#systemctl restart mysqld
mysql> system cp /etc/passwd /myload/
//拷贝passwd到myload目录
mysql> system ls /myload
//查看myload目录
mysql> create database db3;
mysql> use db3;
mysql> create table user (
-> name char(50), password char(1),
-> uid int, gid int, comment char(150),
-> homedir char(150), shell char(100));
//建立user表
mysql> desc user; //查看表结构
mysql> load data infile “/myload/passwd” into table db3.user fields terminated by “:” lines terminated by “\n”;
mysql> alter table db3.user add id int primary key auto_increment first;
mysql> select * from user;
mysql> select *from user where id =1;
数据的导出
Select命令 into outfile “目录名/文件名”;
//多行数据清晰显示
Select命令 into outfile “目录名/文件名”
Fields terminated by “分隔符”; (任意符号都可做分隔符)
//多行数据以分隔符进行显示
Select 命令 into outfile “目录名/文件名”
Fields terminated by “分隔符”(任意符号都可做分隔符)
Lines terminated by “分行符” 多行数据合并一行
注意事项:
导出数据行数由SQL查询决定.
导出的是表记录,不包括字段名.
自动创建存储数据的文件.
存储数据文件,具有唯一性.
管理表记录
Insert into
Insert into 表名 values (字段值列表); //添加一条纪录
Insert into 表名 values(字段值列表),(字段值列表);
查询表记录:
Select 字段1…,字段N from 库名.表名;
Select 字段1…,字段N from 库名.表名 where 条件式;
更新表记录:
批量更新:
update 库名.表名 set 字段名=值,字段名=值,…;
条件匹配更新:
Update 库名.表名 set 字段名=值,字段名=值,…where 条件式;
mysql> update user set password=“a” , comment=“student”;
mysql> select password ,comment from user;
mysql> update user set password=“x”, comment=“root” where id =1;
mysql> select id , password ,comment from user;
删除表记录
Delete from 库名.表名 where 条件格式;
mysql> delete from db2.yg;
mysql> delete from db3.user where id >=22;
匹配条件
基本匹配条件:(适用于 select/update /delete)
数值比较:= != > >= < <=
mysql> select * from user where uid =2 ;
mysql> select name ,uid ,gid from user where uid =gid;
mysql> select from user where id <=10;
字符比较:= !=
mysql> select name from user where name= “mysql”
mysql> select name ,shell from user where shell !="/bin/bash";
范围内比较:
in(在…里)
mysql>select * from wg.t3 where shell
in ("/bin/bash","/sbin/nologin");
not in(不在…里)
select * from wg.t3 where shell
not in ("/bin/bash","/sbin/nologin");
Between 数字 and 数字 (在…之间)
select * from wg.t3 where id between 1 and 10;
Distinct字段名
select distinct shell from wg.t3;
is null 空 is not null 非空
mysql> select id , name from user where name is null;
mysql> select id , name from user where name is not null;
逻辑匹配:or 逻辑或 and 逻辑与 !或not 逻辑非
mysql> select name ,uid , gid, shell from user
-> where name =“root” and uid =100 and gid =100;
mysql> select name ,uid , gid, shell from user where name =“root” or uid =100 or gid =100;
mysql> select name ,uid from user where uid in (1,10,25);
mysql> select name from user
->where name in (“mysql”,“bin”,“httpd”,“root”);
mysql> select name , shell from user
->where shell not in ("/bin/bash","/sbin/nologin");
mysql> select * from user where id between 10 and 20 ;
mysql> select distinct gid from user;
mysql> select distinct shell from user;
高级匹配条件:(适用于 select/update/delete)
1.模糊查询 like ‘通配符’
2._ 表示一个字符
3.% 表示0~n个字符
mysql> select name from user where
name like ‘____’;
mysql> select name from user where
name like “%a%”;
mysql> select name from user where
name like “%_____%”;
正则表达式: ^以开头 以 结 尾 . 一 个 [ ] 范 围 ∗ 多 个 ∣ 或 W h e r e 字 段 名 r e g e x p ‘ 正 则 表 达 式 ’ m y s q l > s e l e c t n a m e f r o m u s e r w h e r e n a m e r e g e x p ′ a ∣ t 以结尾 .一个 []范围 *多个 | 或 Where 字段名 regexp ‘正则表达式’ mysql> select name from user where name regexp '^a|t 以结尾.一个[]范围∗多个∣或Where字段名regexp‘正则表达式’mysql>selectnamefromuserwherenameregexp′a∣t'; //以a开头t结尾的正则
mysql> select name from user where
name regexp ‘1’; //以abc任意范围开头正则
mysql> select name from user where
name regexp ‘^… ′ ; / / 三 字 符 的 正 则 m y s q l > s e l e c t n a m e f r o m u s e r w h e r e n a m e r e g e x p ′ . . '; //三字符的正则 mysql> select name from user where name regexp '^.. ′;//三字符的正则mysql>selectnamefromuserwherenameregexp′..’; //两个的正则
四则运算:+ - * / %取余 ()提高优先级
mysql> select name ,uid from user where uid %2 =0;
mysql> update user set uid=uid+1 where id <=5;
mysql> select name ,uid from user where id <=5;
mysql> update user set uid=uid-1 where id <=5;
mysql> select name ,uid from user where id <=5;
mysql> show databases;
mysql> use db3;
mysql> select name ,2019 - age csnf from user
-> where name =“root”;
mysql> select name , 2019 -age csnf from user;
mysql> select name ,uid,gid, uid+gid he , (uid+gid)/2 pjz from user where name=“bin”;
聚集函数:
Avg(字段名) //统计字段平均值
Sum(字段名) //统计字段之和
Min(字段名) //统计字段最小值
Max(字段名) //统计字段最大值
Count(字段名) //统计字段值个数
mysql> select count() from user;
mysql> select count(name) from user where shell != “/sbin/nologin”;
mysql> select avg(uid) from user;
mysql> select sum(uid) from user;
mysql> select min(uid) from user;
mysql> select max(uid) from user;
mysql> select max(uid) from user where id<=10;
查询结果排序:
Select字段from库名.表名order by 字段名 [asc | desc ]; //asc升序 desc降序
mysql> select name ,uid from user where id <=15 order by uid ; //默认排序升序
mysql> select name ,uid from user where id <=15 order by uid desc; //查询结果排序降序
查询结果分组:
Select 字段 from 库名.表名 group by 字段名;
mysql> select gid from user group by gid;
查询结果过滤:在查找出来的记录里再查一遍
Select 字段 from 库名.表名 where 条件
having 条件表达式;
mysql> select name from user where uid > 5
-> having name =“root”;
mysql> select name from user where uid > 5 having name =“mysql”;
mysql> select name from user where uid >5
-> having name in (“mysql”,“shutdown”);
限制查询结果显示行数:
Select 字段名 from user limit 数字;
Select 字段名 from user limit 数字1,数字2;
Mysql> select name,uid,gid from user limit 3;
Mysql> select name,uid,gid from user limit 3,3;
Mysql管理工具
常见的mysql管理工具:
Mysql 命令行 跨平台
Mysql-workbench 图形 跨平台
Mysql-front 图形 windows
Navicat 图形 windows
phpMyAdmin 浏览器 跨平台
[root@1 ~]# yum -y install httpd php php-mysql
[root@1 ~]# systemctl start httpd
[root@1 ~]# systemctl enable httpd
[root@1~]#tar -xf phpMyAdmin
-2.11.11-all-languages.tar.gz
[root@1 ~]# mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
[root@1 ~]# cd /var/www/html/phpmyadmin/
[root@1 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@1 phpmyadmin]# vim config.inc.php
数据库第四天
用户授权:在数据库服务器上添加新的链接用户.
Grant 权限列表 on 库名 to 用户名@”客户端地址”
Identified by “密码” //授权用户密码 with grant option; //有授权权限,可选项
[root@1 ~]# mysql -uroot -p123456
mysql> grant all on db4.* to yaya@"%" identified by “123qqq…A”;
[root@2 ~]# mysql -h192.168.4.50 -uyaya -p123qqq…A;
mysql> select user(); 51虚拟机
mysql> select user(); 50虚拟机
Grant授权:
权限列表:
恢复root密码:
1.停止mysql服务程序
2.跳过授权表启动mysql服务程序
3.修改root密码
4.以正常方式重启mysql服务程序
[root@mysql51 ~]# systemctl stop mysqld.service
[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
…
Skip-grant-tables
[root@mysql51 ~]# systemctl restart mysqld
[root@mysql51 ~]# mysql
mysql> update mysql.user set authentication_string=password(“123abc…A”)
-> where
-> user=“root” and host=“localhost”;
mysql> flush privileges;
mysql> quit
重置root密码
[root@mysql51 ~]#mysqladmin -uroot -p
password “新密码”
Enter password://输入旧密码
数据的备份:
物理备份及恢复:
Cp -r /var/lib/mysql 备份目录/mysql.bak
Scp -r /var/lib/mysql root@”客户机ip” :/tmp
恢复操作
Cp -r 备份目录/mysql.bak /var/lib/mysql/
Chown -R mysql:mysql /var/lib/mysql
[root@mysql50 ~]# cp -r /var/lib/mysql /root/mysql.bak
[root@mysql50 ~]# scp -r /root/mysql.bak/ [email protected]:/tmp/
[root@mysql51 ~]# systemctl stop mysqld.service
[root@mysql51 ~]# rm -rf /var/lib/mysql
[root@mysql51 ~]# cp -r /tmp/mysql.bak /var/lib/mysql
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql51 ~]# systemctl start mysqld
[root@mysql51 ~]# systemctl status mysqld.service
[root@mysql51 ~]# mysql -uroot -p123456
完全备份:
Mysqldump -uroot -p密码 库名 > 目录/xxx.sql
备份时库名标识方式:
–all-databases 或 -A //所有库
-数据库名 //单个库
-数据库名 表名 //单张表
-B 数据库1 数据库2 //多个库
[root@mysql50 ~]# mkdir /mybak //存放备份文件
[root@mysql50 ~]# mysqldump -uroot
-p123456 -A > /mybak/all.sql //完全备份所有表
[root@mysql50 ~]# mysqldump -uroot
-p123456 db2 > /mybak/db2.sql //完全备份db2表
[root@mysql50 ~]# ls /mybak/
[root@mysql50 ~]# cd /mybak/
[root@mysql50 mybak]# scp db2.sql [email protected]:/root/ //传入恢复主机
[root@mysql51 ~]# mysql -uroot -p123456
mysql> drop database db2;
mysql> create database db2; //模拟误删除
完全恢复:
Mysql -uroot -p密码 [库名] < 目录/xxx.sql
[root@mysql51 ~]# mysql -uroot -p123456 db2 < /root/db2.sql //db2表完全恢复
[root@mysql50 mybak]# scp all.sql [email protected]:/root/
[root@mysql51 ~]# mysql -uroot -p123456 < /root/all.sql //全部完全恢复替换掉
逻辑备份:
Mysqldump //备份命令
Mysql //恢复命令
增量备份:备份上次备份后,所有新产生的数据
binlog日志
定义:1.也称作 二进制日志
2.mysql服务日志文件的一种
3.记录除查询之外的所有sql命令
4.可用与数据备份和恢复
5.配置mysql主从同步的必要条件
启用日志:
Server_id=数字 (指定id值(1-255)
Log_bin[=目录名/文件名] 启用binlog日志
Max_binlog_size=数值m 指定日志文件容量,默认1G
Vim /etc/my.cnf
[mysqld]
…
Log_bin
Server_id=100
Systemctl restart mysqld
]# mysql -uroot -p123456
mysql> show master status;
mysql> create database db5;
mysql> create table db5.t1(id );
mysql> insert into db5.t1 values(100);
mysql> insert into db5.t1 values(200);
mysql> insert into db5.t1 values(300);
mysql> show master status;
mysql> select * from db5.t1;
手动生成新的日志文件
1.systemctl restart mysqld
2.mysqldump -uroot -p123456
–flush-logs db5 > /root/db5.sql
3.mysql -uroot -p123456 -e “flush logs”
4.mysql> flush logs
删除已有的日志文件
mysql> purge master logs to “plj.000004” ;
mysql> reset master ;
使用日志恢复数据
差异备份:
备份完全备份后,所有新产生的数据
分析日志:
查看日志当前记录格式
Mysql>show variables like “binlog_format”;
三种记录方式:
1.Statement //报表模式
2.Row //行模式
3.Mixed //混合模式
修改日志记录格式:
[mysqld]
binlog_format=“mixed”
mysql> show variables like “binlog_format”
分析日志:
Mysqlbinlog [选项] binloh 日志文件名
–start-datetime=”yyyy-mm-dd hh:mm:ss” 起始时间
–stop-datetime=”yyyy-mm-dd hh:mm:ss” 结束时间
–start-position=数字 起始偏移量
–stop-position=数字 结束偏移量
恢复数据:
格式:mysqlbinlog 日志文件 | mysql -uroot -p密码
#cd /var/lib/mysql
#mysqlbinlog mysql-bin.000001 | mysql -uroot -p123456
数据库第五天
Mysql备份工具
物理备份缺点:
跨平台性差
备份时间长.冗余备份.浪费存储空间
Mysqldump备份缺点
效率较低,备份和还原速度慢,锁表
备份过程中,数据插入和更新操作被阻塞
1 安装percona软件
innobackupex 命令的常用选项
–user 用户名 --host 主机名
–password 密 码 --no-timestamp 不用时间轴
–apply-log 准备恢复数据 --export 导出表信息
–import 导入表空间 --copy-back 拷贝数据
–redo-only 日志合并
完全备份与恢复:
Innobackupex --user 用户名 --password 密码 备份目录名 --no-timestamp
[root@host50 ~]#innobackupex --user
root --password 123456 /allbak --no-timestamp
[root@host50 ~]# ls /allbak
Innobackupex --apply-log 目录名 //准备恢复数据
Innobackupex --copy-back 目录名 //恢复数据
增量备份:
Innobackupex --user用户名 --password 密码
–incremental 增量目录 --incremental-basedir=
目录名 --no-timestamp
增量恢复:
Innobackupex --apply-log --redo-only 目录名
–incremental-dir=目录名 //准备恢复数据
Innobackupex --copy-back 目录名 //恢复数据
必须先有一次备份,通常是完全备份.周一完全备份,周二到周日增量备份.
[root@mysql50 ~]# innobackupex --user root --password 123456 /zhouyi --no-timestamp
//周一做完全备份
[root@mysql50 ~]# ls /zhouyi
添加记录
[root@mysql50 ~]# mysql -uroot -p123456
mysql> insert into db5.a values(301);
mysql> insert into db5.a values(302);
mysql> insert into db5.a values(908);
[root@mysql50 ~]# innobackupex --user root --password 123456 --incremental /new1dir --incremental-basedir=/zhouyi --no-timestamp
//周二做增量备份
[root@mysql50 ~]# ls /new1dir
添加记录
mysql> insert into db5.a values(401);
mysql> insert into db5.a values(888);
[root@mysql50 ~]# innobackupex --user root --password 123456 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
//周三做增量备份
[root@mysql50 ~]# ls /new2dir
恢复数据
完全恢复:
[root@mysql51 ~]# systemctl stop mysqld.service
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
[root@mysql51 ~]# innobackupex --apply-log --redo-only /tmp/zhouyi/
[root@mysql51 ~]# innobackupex --apply-log --redo-only /tmp/zhouyi/ --incremental-dir=/tmp/new1dir
//合并
[root@mysql51 ~]# innobackupex --apply-log --redo-only /tmp/zhouyi/ --incremental-dir=/tmp/new2dir
[root@mysql51~]# innobackupex --copy-back /tmp/zhouyi/
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql51 ~]# systemctl start mysqld
[root@mysql51 ~]# mysql -uroot -p123456
删除单张表:
删除表空间
mysql> alter table db5.b discard tablespace;
导出表信息
]# innobackupex --apply-log --export /tmp/allbak
拷贝表信息文件到数据库目录下
]# cp /tmp/allbak/db5/b.{cfg,exp,ibd} /var/lib/mysql/db5/
修改表信息文件的所有者及组用户为mysql
]# chown mysql:mysql /var/lib/mysql/db5/b.*
导入表空间
mysql> alter table db5.b import tablespace;
删除数据库目录下的表信息文件
mysql> system rm -rf /var/lib/mysql/db5/b.cfg
mysql> system rm -rf /var/lib/mysql/db5/b.exp
查看表记录
mysql> select * from db5.b;
数据库进阶一天
主从同步:
实现数据自动同步的服务结构
主服务器:接受客户端访问链接
从服务器:自动同步主服务器数据
主从同步原理:
主服务器master
启用binlog日志
从服务器slave
设置server_id
确保与主服务器数据一致
指定主库信息
启动slave程序
常看状态信息
配置主服务器
#vim /etc/my.cnf
[mysqld]
Log_bin=日志名 启用binlog日志
Server_id=id值 指定服务器ID号
#sysetmctl restart mysqld
授权用户:
Mysql> grant replication slave on . to repluser
@”%” identified by ‘123qqq…A’;
51:
]#mysqldump -uroot -p123456 --master-data db5 > /root/db5.sql
]#scp /root/db5.sql [email protected]:/root/
52:
mysql> create database db5;
]# mysql -uroot -p123qqq…A db5 < /root/db5.sql
mysql> select count() from db5.a;
mysql> select count() from db5.b;
]# grep master51 /root/db5.sql
mysql>change master to master_host=“192.168.4.51” ,
master_user=“repluser” ,
master_password=“123qqq…A” ,
master_log_file=“master51.000001” , master_log_pos=441 ;
mysql> start slave ;
mysql> show slave status\G;
Master_Host: 192.168.4.51
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Connecting
Last_IO_Error: error connecting to master ‘[email protected]:3306’ - retry-time: 60 retries: 49
Slave_SQL_Running: No
Last_SQL_Error:
stop slave ;
change master to 选项目=值 , 选项目=值 ;
start slave ;
show slave status \G;
3 验证配置
4 主从同步扩展
配置一主多从
配置主从从
[root@53 ~]# mysql -uroot -p123qqq…A -e ‘grant all on gamedb.* to yaya88@"%" identified by “123qqq…A”’
[root@50 ~]# mysql -h192.168.4.53 -uyaya88 -p123qqq…A
mysql> create database gamedb;
mysql> create table gamedb.t1 ( id int);
mysql> insert into gamedb.t1 values(100);
mysql> select * from gamedb.t1;
[root@50 ~]# mysql -h192.168.4.54 -uyaya88 -p123qqq…A -e ‘select * from gamedb.t1’
[root@50 ~]# mysql -h192.168.4.55 -uyaya88 -p123qqq…A -e ‘select * from gamedb.t1’
配置主主结构:( 把数据库服务器192.168.4.56 和 192.168.4.57 配置为主主结构)
修改复制模式?
主服务器修改为半同步复制模式
从服务器修改为半同步复制模式
1 命令行加载模块
mysql> show variables like ‘have_dynamic_loading’; 查看
mysql> install plugin rpl_semi_sync_master SONAME “semisync_master.so”;
mysql> install plugin rpl_semi_sync_slave SONAME “semisync_slave.so”;
mysql> select plugin_name, plugin_status from information_schema.plugins where plugin_name like ‘%semi%’;
2 命令行启用模块
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show variables like “rpl_semi_sync_%_enabled”;
3 修改配置文件永久有效
]# vim /etc/my.cnf
[mysqld]
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代理面向客户端提供服务
收到sql写请求时,交给master服务器处理
收到sql写请求时,交给slave服务器处理
构建思路:
1.确保一主一从结构
2.部署mysql代理服务器
装包,修改配置文件,启动服务
3.测试配置
客户端链接代理服务访问数据
Maxscale服务:
部署maxscale服务:
[root@mysql57 ~]# systemctl stop mysqld.service
[root@mysql57~]#systemctl disable mysqld
修改配置/etc/maxscale.cnf
[maxscale] //定义线程个数
Threads=1
[server1] //定义数据库服务器
Type=server
Address =192.168.4.51 //master主机ip地址
Port=3306
Protocol=mysqlbackend
[server2]
Type=server
Address =192.168.4.52 //slave主机ip地址
Port=3306
Protocol=mysqlbackend
[MySQL Monitor] //定义要监视的数据库节点
type=monitor
module=mysqlmon
servers=server1, server2 //主,从数据库的主机名
user=maxscalemon //监控用户(自定义)
passwd=123qqq…A
monitor_interval=10000
[Read-Write Service] //定义读写分离的数据库节点
type=service
router=readwritesplit
servers=server1, server2 //主从数据库的主机名
user=maxscalerouter //路由用户(自定义)
passwd=123qqq…A //密码
max_slave_connections=100%
[Read-Write Listener] //定义读写分离服务端口号
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener] //定义管理服务端口号
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016
部署maxscale服务
在主/从服务器创建授权用户
Mysql> grant replication slave,replication client on . to maxscalemon@’%’ identified by ‘123qqq…A’
//创建监控用户
Mysql> grant select on mysql.* to maxscalerouter@ ‘%’ identified by ‘123qqq…A’; //创建路由用户
启动服务:
#maxscale -f /etc/maxscale.cnf
#netstat -anput | grep maxscale
#kill -9 PID号
测试配置:
代理服务器访问:
#maxadmin -uadmin -pmariadb -P端口 list servers
//查看服务器列表
客户端链接代理访问数据
#mysql -h服务地址 -P端口 -u用户名 -p密码
Mysql多实例:
配置多实例:
修改目录名:
Mv 数据目录 /usr/local/mysql
#yum -y install libaio
#useradd mysql
#tar -zxvf mysql-5.7.20…tar.gz
#mv mysql-5.7.20…tar.gz
修改PATH路径
#PATH=/usr/local/mysql/bin:KaTeX parse error: Expected 'EOF', got '#' at position 6: PATH #̲vim /etc/bashrc…PATH
主配置文件/etc/my.cnf
[mysqld_multi] //启用多实例
mysqld=/usr/local/mysql/bin/mysqld_safe
//指定进程文件
mysqladmin = /usr/local/mysql/bin/mysqladmin
//指定管理命令路径
user = root //指定进程用户
[mysqld1] //实例进程名称
port = 3307 //端口号
datadir = /dir1 //数据库目录,手动创建
socket = /dir1/mysqld1.sock
//指定sock文件的路径和名称
pid-file = /dir1/mysqld1.pid //进程pid号文件位置
log-error = /dir1/mysqld1.err //错误日志位置
启动服务
Mysqld_multi start 实例编号
停止服务
Mysqld_multi --user=root --password=密码 stop 实例编号
连接多实例
Mysql -uroot -p”密码’ -S sock文件
数据库进阶第三天
[root@mysql56~]# tar -xf Mycat-server-1.6-
RELEASE-20161028204710-linux.tar.gz
[root@mysql56 ~]# mv mycat/ /usr/local/
[root@mysql56 ~]# ls /usr/local/mycat/
分库分表:
水平分割,垂直分割,
横向切分,纵向切分
分片规则:
Mycat支持提供10种分片规则
1.枚举法:sharding-by-intfile
2.固定分片: rule1
3.范围约定: auto-sharding-long
4.求模法: mod-long
5.日期列分区发: sharding-by-date
6.通配取模: sharding-by-pattern
7.ASCII码求模通配: sharding-by-prefixpattern
8.编程指定:sharding-by-substring
9.字符串拆分hash解析sharding-by-stringhash
10.一致性hash sharding-by-murmur
部署mycat服务:
#yum -y install java-1.8.0-openjdk /装jdk
#tar -xf Mycat-server-1.6-RELEASE-
20161028204710-linux.tar.gz /装mycat
#mv mycat/ /usr/local/ /移动到/usr/local
#ls /usr/local/mycat/ /查目录
#cd conf
2.2 修改文件
2.2.1 定义客户端连接mycat服务的用户 server.xml
2.2.2 配置数据分片 schema.xml
]#sed -i ‘56,77d’ /usr/local/mycat/conf/schema.xml
]# sed -i ‘39,42d’ /usr/local/mycat/conf/schema.xml
]# sed -i ‘16,18d’ /usr/local/mycat/conf/schema.xml
]# sed -i ‘45,47d’ /usr/local/mycat/conf/schema.xml
]# sed -i ‘43d’ /usr/local/mycat/conf/schema.xml
目录结构:ls /usr/local/mycat/
Bin //mycat命令
Catlet //扩展功能
Conf //配置文件
Lib //mycat使用的jar包
Logs //mycat启动日志和运行日志
Wrapper.log //mycat服务启动日志
Mycat.log //记录sql脚本执行后的报错内容
**重要配置文件说明:
Server.xml //设置连接账号及逻辑库
Schema.xml //配置数据分片
Rule.xml //分片规则
其他文件 //函数调用文件
创建连接用户:
/usr/local/mycat/conf/server.xml
定义客户端mycat服务的用户
配置数据分片:
定义分片的表
… //定义分片信息
定义数据节点 数据库进阶第四天 #yum -y install mha4mysql- 管理集群命令: 2 创建主配置文件app1.cnf 创建故障切换脚本 配置数据库服务器 在所有数据库服务器上安装mha_node包 在所有数据库服务器上做授权用户 配置主服务器,修改数据库服务运行参数 [mysqld] relay_log_purge=0 //禁止自动删除中级日志文件 数据库进阶第五天 #yum -y install percona-xtrabackup- Wsrep_cluster_address=gcomm://192.168.4.71,192. 168.4.72,192.168.4.73 //集群成员列表,号分割 [mysqld] #vim /etc/mysqld_safe.cnf //此配置文件保持默认配置即可 分别修改3台服务器的配置文件 mysql> alter user root@localhost identified by ‘123456’; 192.168.4.71 主机的恢复步骤 mysql配置存储引擎: 数据库NOSQL第一天 #./utils/install_server.sh ]# netstat -antupl |grep :6379 //查看端口 127.0.0.1:6379> ping 常用配置: 优化设置: ]# systemctl start php-fpm //启动服务 ]# cd phpredis-2.2.4/ 测试配置 访问网站脚本 数据库NOSQL第二天 192.168.4.51:6351 192.168.4.52:6352 192.168.4.53:6353 Check for open slots… 在管理主机,查看集群新消息 Check for open slots… ]# /etc/init.d/redis_6379 stop Configure node as replica of 192.168.4.58:6358. //提示添加完成 数据库NOSQL第三天 192.168.4.52:6352> info replication //查看复制信息 role:slave //从服务器 使用RDB文件恢复数据 优化设置: AOF AOF文件恢复数据: 优化配置: 修复AOF文件:把文件恢复到最后一次的正确操作 AOF优点:可以灵活设置持久化方式.出现意外宕机时,仅可能丢失1秒数据 Hash表 abc ↩︎
Name //数据节点名
Datahost //数据库服务器主机名
Database //数据库名
集群定义:多台服务一起提供相同的服务
集群类型:LB HA HPC
部署过那些集群:LB HA
使用的是什么软件: LVS 、 Nginx 、Haproxy 、keepalived
部署MHA集群
2.1 配置管理主机192.168.4.57
配置ssh免密认证登录
#ssh-keygen
#ssh-copy-id [email protected]
配置一主多从
51主:
#vim /etc/my.cnf
[mysqld]
Server_id=51
Log-bin=master51
#systemctl restart mysqld
Mysql> grant replication slave on . to repluser@”%” identified by ‘123qqq…A’;
Mysql> show master status;
52.53从
#vim /etc/my.cnf
[mysqld]
Server_id=52
#systemctl restart mysqld
Mysql>change master to
Master_host=’192.168.4.51’,
Master_user=’repluser’,
Master_password=’123qqq…A’,
Master_log_file=”master51.000001”,
Master_log_pos=441;
53从同步 查看主值进行写入
MHA集群环境
配置ssh免密登录
安装依赖包
配置一主多从结构
1 安装mha软件yum -y install perl-ExtUtils-*
yum -y install perl-CPAN*
node-0.56-0.el6.noarch.rpmtar -zxf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.pl
make
make install
#ls /root/perl5/bin/masterha_*
]# mkdir /etc/mha
]# 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_user=root //访问ssh服务用户
ssh_port=22 //ssh服务端口 Repl_user=repluser //主服务器数据同步授权用户
repl_password=123qqq...A //密码
User=root //监控用户
password=123qqq...A //密码
[server1] //定义1台数据库服务器
hostname=192.168.4.51 //服务器ip地址
port=3306 //服务端口
candidate_master=1 //竞选主服务器
[server2] //定义2台数据库服务器
hostname=192.168.4.52
port=3306
candidate_master=1
[server3] //定义3台数据库服务器
hostname=192.168.4.53
port=3306
candidate_master=1
:wq
[root@mgm57 ~]# cp mha-soft-student/master_ip_failover /etc/mha/
[root@mgm57 ~]#
[root@mgm57 ~]# chmod +x /etc/mha/master_ip_failover
[root@mgm57 ~]#
[root@mgm57 ~]# vim /etc/mha/master_ip_failover
my $vip = “192.168.4.100/24”; //定义vip地址
my $key = “1”; //定义地址编号
my s s h s t a r t v i p = “ / s b i n / i f c o n f i g e t h 0 : ssh_start_vip = “/sbin/ifconfig eth0: sshstartvip=“/sbin/ifconfigeth0:key $vip”;
//绑定vip地址
my s s h s t o p v i p = “ / s b i n / i f c o n f i g e t h 0 : ssh_stop_vip = “/sbin/ifconfig eth0: sshstopvip=“/sbin/ifconfigeth0:key down”;
//释放vip地址
把vip地址手动部署在当前的主服务器51 上
host51~]# ifconfig eth0:1 192.168.4.100/24
host51~]# ifconfig eth0:1
]#yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
mysql> grant all on . to root@"%"
identified by “123qqq…A”; //监控用户
Mysql> grant replication slave on . to repluser@’%’ identified
By ‘123qqq…A’;vim /etc/my.cnf
plugin-load = “rpl_semi_sync_master=
semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”
//加载模块
rpl_semi_sync_master_enabled=1 //启用master模块
rpl_semi_sync_slave_enabled=1 //启用slave模块
[root@host51 ~]# systemctl restart mysqld
备用服务器52…53,与51同步
启动管理服务
[root@mgm57 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover[root@mgm57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:24311) is running(0:PING_OK), master:192.168.4.51
[root@mgm57 ~]# cd /etc/mha/
[root@mgm57 mha]# ls
app1.cnf manager.log
app1.master_status.health master_ip_failover
客户端连接vip地址访问数据库服务
]# mysql -h192.168.4.100 -uyaya55 -p123qqq…A
Mysql> show grants;
Mysql> insert into db9.a values(100);
Mysql> select * from db9.a;
MHA
环境准备: 安装依赖软件perl ssh免密登陆 一主多从
配置管理主机 : 安装软件 修改app1.cnf 创建故障切换脚 本 指定vip地址
配置数据库服务器: 安装软件 用户授权 主服务器手动配置vi p地址
启动管理服务: 测试ssh配置 测试主从同步配置 启动服务
测试高可用:当前主服务器宕机 客户端依然可以访问vip地址 连接数据库服务
把宕机的服务器添加到集群里:
启动服务 数据一致 在app1.cnf文件添加主机
测试配置 启动管理服务
PXC集群
环境准备:3台服务器上分别安装pxc软件
[root@pxcnode73 ~]# cd PXC/rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
24-2.4.13-1.el7.x86_64.rpmrpm -ivh qpress-1.1-14.11.x86_64.rpm
yum -y install Percona-XtraDB-Cluster-*.rpm
ls /etc/percona-xtradb-cluster.conf.d/
vim wsrep.cnf
Wsrep_node_address=192.168.4.71 //本机ip地址
Wsrep_cluster_name=pxc-cluster
//集群名称,几台集群几台必须相同
Wsrep_node_name=pxcnode71
//本机主机名随主机名改变
Wsrep_sst_auth=”sstuser:123qqq…A”
//sst数据同步授权用户,什么授权用户什么密码随机应变vim mysqld.cnf
Server-id=1 //server-id不允许重复
#systemctl start [email protected] /启动集群服务systemctl start mysql
mysqld.cnf //数据库服务运行参数配置文件
Wsrep.cnf //pxc集群配置文件
Mysqld_safe.cnf //percona server 配置文件
启动服务:
#systemctl start [email protected]grep pass /var/log/mysqld.log
mysql -uroot -p’Fwh5Mftfsx%;’
mysql> grant reload,lock tables,replication client,process on . to sstuser@‘localhost’ identified by ‘123qqq…A’;
mysql> show databases;
72和73分别启动数据库服务
#systemctl start mysql
#netstat -anput | grep :3306
#netstat -anput | grep :4567
管理员登录查看状态:
show status like “%wsrep%”;
客户端访问集群存取数据:mysql -h192.168.4.71/72/73 -u用户 -p密码
]# systemctl stop [email protected]
]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.4.72,192.168.4.73
:wq
]# systemctl start mysql
]# netstat -utnlp | grep :3306
]# netstat -utnlp | grep :4567 ]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.4.72,192.168.4.73,192.168.4.71
列出可用的存储引擎:
Mysql>show engines;
格式:alter table 表明 engine=存储引擎名;
Mysql>use test;
Mysql>create table intab(id int(4)) engine=innoDB;
Mysql>show create table intab\G;
设置数据库服务使用的存储引擎(/etc/my.cnf)
#vim /etc/my.cnf
[mysqld]
Default-storage-engine=存储引擎
#systemctl restart mysqld
Myisam存储引擎:支持表级锁,不支持事务.事务回滚.外键
表文件:表名.frm //表结构 表名.MYI //索引 表名.MYD //数据
Innodb存储引擎:支持行级锁定,只是事务.事务回滚.外检
表文件:表名:frm //表结构 表名.ibd
事务日志文件:ibdata1 ib_logfile0 ib_logfile1
Mysql锁机制
锁粒度
表级锁:对整张表加锁
行级锁:仅对被访问的行分别加锁
锁类型
读锁:支持并发读
写锁:是独占锁,上锁期间其他线程不能读表或写表
查看当前锁的状态
Show status like “table_lock%”;
事务特征(ACID):
Atomic:原子性
Consistency:一致性
Isolation:隔离性
Durability:持久性
Mysql>show variables like “autocommit”; //查看提交状态
Mysql>set autocommit=off
Mysql>rollback; //数据回滚(恢复删除的内容=撤销)
Mysql>commit; //提交数据(确定撤销生成)
RDBMS软件:
MySql MariaDB Oracle DB2 SQL Server
NoSqL软件:
Memcached Redis MongoDB
CouchDB Neo4j FlockDB
部署Redis服务:
#yum -y install gcc //源码编译安装
#tar -zxvf redis-4.0.8.tar.gzcd redis-4.0.8/
make && make install
Redis初始化:回车直接跳过
6379 //端口号
/etc/redis/6379.conf //配置文件目录
/var/log/redis_6379.log //日志目录
/var/lib/redis/6379 //数据库目录
/usr/local/bin/redis-server //启动程序的目录
/usr/local/bin/redis-cli //命令行的连接工具
不同服务更改脚本:/etc/init.d/redis_6379/etc/init.d/redis_6379 stop //停止服务
/etc/init.d/redis_6379 start //启动服务
ps -C redis-server //查看进程
redis-cli //默认连接127.0.0.1地址的 6379端口
PONG //PONG说明服务正常
127.0.0.1:6379> set name bob //存数据
127.0.0.1:6379> get name //取数据
常用命令:
Set 名字 数据 //存储1个数据
Mset 名字列表 //存储多个数据
Get 名字 //获取单个数据
Mget //获取多个数据
Select 数据库编号0-15 //切换库
Keys * //显示所有数据
Keys a? //显示指定a名字
Exists 名字 //测试名字是否存在
Ttl 名字 //查看key生存时间
Type 名字 //查看名字类型
Move 名字 库编号 //移动名字到指定库
Expire 名字 数字 //设置名字有效时间
Del 名字 //删除指定的名字
Flushall //删除所有名字
Flushdb //删除所有库的所有名字
Save //保存所有名字到硬盘
Shutdown //停止服务
配置分类:
Maxmemory //最大内存
Maxmemory-policy //定义使用策略
Maxmemory-samples //选取模块的个数
(对于lru和ttl策略)
连接密码:
#vim /etc/redis/6379.conf
Requirepass 123456 //不改密码勿用操作
Bind 192.168.4.50 //redis访问-h IP地址
Port 6350 //redis访问-p 自设端口
例:
#redis-cli -h192.168.4.50 -p 6350 //连接服务
192.168.4.50:6350>auth123456 //输入密码
OK
192.168.4.50:6350>ping
PONG
#redis-cli -h 192.168.4.50 -p 6350 -a 123456
//设置密码的连接方式
#redis-cli -h 192.168.4.50 -p 6350 shutdown
//无密码停止服务(有密码加 -a 123456 shutdown)
部署LNMP+Redis:
1)安装源码nginx软件及php-fpm
#yum -y install gcc pcre-devel zlib-devel //安装依赖
]#tar -zxvf nginx-1.12.2.tar.gz //解压
]#cd nginx-1.12.2 //进源码目录
]#./configure //配置
]#make && make install
]#yum -y install php-fpm //安装php-fpm
] # vim +65 /usr/local/nginx/conf/nginx.con/usr/local/nginx/sbin/nginx
]# netstat -utnlp | grep :9000 //查看端口
]# /usr/local/nginx/sbin/nginx
]# vim /usr/local/nginx/html/test.php
//编写php文件
]# curl http://localhost/test.php //访问nginx服务
配置php支持redisyum -y install php php-devel automake autoconf //安装依赖
tar -zxf php-redis-2.2.4.tar.gz //安装扩展包
]# phpize //生成配置文件php-config及 configure命令
]# ./configure --with-php-config=/usr/bin/php-config //配置
]# make && make install //编译安装
修改php.ini文件
]#vim /etc/php.ini
728 extension_dir = “/usr/lib64/php/modules/”
//模块文件目录
730 extension = “redis.so” //模块文件名
]# systemctl restart php-fpm //重启php-fpm服务
]# php -m | grep -i redis //查看已加载的模块
[root@host50 ~]# netstat -utnlp | grep redis-server
[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456 //访问服务
编写网站脚本
]# vim /usr/local/nginx/html/linkredis.php
]#curl http://localhost/linkredis.php
//访问nginx服务
[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456 //连接redis服务
192.168.4.50:6350> keys * //查看变量
Redis-trib脚本用法:
#redis-trib.rb <命令> <选项><参数>
Create 创建集群 check 检查集群
Info 查看集群信息 reshard 重新分片
Del-node 删除主机 add-node --slave 添加从主机
Add-node 添加master主机
rebalance 平均分配hash slots
创建集群:
1.部署管理主机:
[root@mgm57 ~]#yum -y install rubygems
[root@mgm57 ~]# which gem
[root@mgm57 ~]# gem install redis-3.2.1.gem
2.创建管理集群脚本:
[root@mgm57 ~]#mkdir /root/bin
//创建命令检索目录
[root@mgm57 ~]#tar -zxvf redis-4.0.8.tar.gz
[root@mgm57 ~]#cd redis-4.0.8/src/
[root@mgm57 ~]#cp redis-trib.rb /root/bin/
//创建管理集群脚本
[root@mgm57 ~]#chmod +x /root/bin
/redis-trib.rb
[root@mgm57 ~]#redis-trib.rb help
//查看命令帮助
3.启动服务器192.168.4.51的集群功能:
[root@redisA ~]# /etc/init.d/redis_6379 stop
//停止redis服务
Stopping …
Waiting for Redis to shutdown …
Redis stopped
[root@redisA ~]# vim /etc/redis/6379.conf
//修改配置文件
bind 192.168.4.51 //修改ip
port 6351 //修改端口(可选配置)
cluster-enabled yes //启用集群功能
cluster-config-file nodes-6379.conf
//存储集群信息的配置文件
cluster-node-timeout 5000
//集群节点通信超时时间
[root@redisA ~]# vim +43 /etc/init.d/redis_6379
$CLIEXEC -h 192.168.4.51 -p 6351 shutdown
//更改脚本下的进入方式(不同端口需要进行设置)
[root@redisA ~]# /etc/init.d/redis_6379 start
[root@redisA ~]# netstat -utnlp | grep redis-server
//查看运行进程
以下服务器52-56-N 与上同步↑
管理服务器设备创建集群
[root@mgm57 ~]# redis-trib.rb create --replicas 1 \
192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356
Can I set the above configuration? (type ‘yes’ to accept): yes //同意以上配置
[OK] All nodes agree about slots configuration.
Check slots coverage…
[OK] All 16384 slots covered.
//提示16384个槽分配完毕
查看集群信息:
1)在管理主机查看集群信息
[root@mgm57 ~]# redis-trib.rb info 192.168.4.51:6351
//查看集群信息
2)在管理主机检测集群
[root@mgm57 ~]# redis-trib.rb check 192.168.4.51:6351 //检测集群
3)在任意一台redis服务器,查看集群信息
[root@redisA ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> cluster info //查看集群信息
192.168.4.51:6351> cluster nodes //查看集群节点信息
访问集群
1)客户端连接随意服务器存数据
[root@client50 ~]# redis-cli -c -h 192.168.4.51 -p 6351 //连接服务器51
192.168.4.51:6351>
192.168.4.51:6351> set x 100 //存储
-> Redirected to slot [16287] located at 192.168.4.53:6353 //提示存储在53主机
192.168.4.53:6353> set y 200 //存储
192.168.4.53:6353> keys * //查看所有
192.168.4.53:6353> set z 300 //存储
-> Redirected to slot [8157] located at 192.168.4.52:6352 //提示存储在52主机
4.添加服务器
1)装包,初始化,启用集群功能,重启服务
]#yum -y install gcc
]#tar -zxvf redis-4.0.8.tar.gz
]#cd redis-4.0.8/
]#make && make install
]#./utils/install_server.sh
]# /etc/init.d/redis_6379 stop
vim /etc/redis/6379.conf
bind 192.168.4.58
port 6358
cluster-enabled yes //启用集群
cluster-config-file nodes-6379.conf
//存储集群信息文件
cluster-node-timeout 5000
]# vim +43 /etc/init.d/redis_6379
$CLIEXEC -h 192.168.4.58 -p 6358 shutdown
:wq
]# /etc/init.d/redis_6379 start
]# netstat -utnlp | grep redis-server
2)添加master角色主机到集群
[root@mgm57 ~]# redis-trib.rb add-node 192.168.4.58:6358 192.168.4.53:6353
//执行添加命令
[OK] New node added correctly. //提示添加完成
[root@mgm57 ~]# redis-trib.rb info 192.168.4.53:6353 //查看集群信息
[OK] 8 keys in 4 masters.
0.00 keys per slot on average.
3)在管理主机,检测集群
[root@mgm57 ~]# redis-trib.rb check 192.168.
4.53:6353 //检测集群
[OK] All nodes agree about slots configuration.
Check slots coverage…
[OK] All 16384 slots covered.
4)管理主机,重新分配hash槽
[root@mgm57 ~]# redis-trib.rb reshard 192.168.4.53:6353
How many slots do you want to move (from 1 to 16384)?4096 //拿出4096个hash 槽给主机192.168.4.58(平均值)
What is the receiving node ID? c5e0da48f335c46a2ec199faa99b830f537dd8a0
//主机192.168.4.58的id值
Source node #1:all
//从当前所有master服务器获取hash槽
Do you want to proceed with the proposed reshard plan (yes/no)?yes //同意以上配置
5.添加slave角色主机到集群里
1)部署新的redis服务器4.59
]#yum -y install gcc
]#tar -zxvf redis-4.0.8.tar.gz
]#cd redis-4.0.8/
]#make && make install
]#./utils/install_server.sh
vim /etc/redis/6379.conf
bind 192.168.4.59
port 6359
cluster-enabled yes //启用集群
cluster-config-file nodes-6379.conf //存储集群信息文件
cluster-node-timeout 5000
]# vim +43 /etc/init.d/redis_6379
$CLIEXEC -h 192.168.4.59 -p 6359 shutdown
]# /etc/init.d/redis_6379 start
]# netstat -utnlp | grep redis-server
在管理主机,添加slave角色主机
[root@mgm57 ~]# redis-trib.rb add-node --slave 192.168.4.59:6359 192.168.4.51:6351 //执行添加命令
[OK] New node added correctly.
2)在管理主机,查看集群新消息
[root@mgm57 ~]# redis-trib.rb info 192.168.4.51:6351 //查看信息
移除服务器
1)移除slave服务器,从服务器没有槽,直接移除即可
[root@mgm57 ~]# redis-trib.rb del-node 192.168.4.51:6351 f6649ea99b2f01faca26217691222c17a3854381 //执行移除命令
2)移除master服务器占用的hash槽
[root@mgm57 ~]# redis-trib.rb reshard 192.168.4.53:6353
How many slots do you want to move (from 1 to 16384)?4096 //移除4096个数槽
What is the receiving node ID? bc5c4e082a5a3391b634cf433a6486c867cfc44b
//要移动给谁的id即目标主机(这里可以随机写一个master的ID hash槽给那个ip
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0
//从谁那移动即源主机(这里写4.58的ID//移除主机的号
Source node #2:done //第二个主机号设置完毕
主从复制: 一主一从,一主多从, 主从从
配置主从复制:
配置从库:redis服务运行后,默认都是master服务器redis-cli -h 192.168.4.52 –p 6352
Replication
master_host:192.168.4.51 //主服务器ip地址
master_port:6351 //主服务器端口
master_link_status:up //与主库连接状态开启
192.168.4.52:6352> slaveof 192.168.4.51 6351
//使52作为51的主库
#vim /etc/redis/6379.conf
slaveof 192.168.4.51 6351
//在文件末尾添加或在原有配置项上修改都可以
配置待验证的主从复制:
配置master
#sed -n ‘501p’ /etc/redis/6379.conf
Requirepass 123456
配置slave
#vim +289 /etc/redis/6379.conf
Masterauth 123456
哨兵服务:发现master宕机后,从服务器升级为主服务器
主配文件 sentinel.conf
配置哨兵服务:
#vim /etc/sentinel.conf //新建主配置文件
sentinel monitor server51 192.168.4.52 6352 1
bind 0.0.0.0 //服务地址
port 26379 //哨兵服务端口
Sentinel auth-pass server51 123456 //连接服务
:wq
#redis-sentinel /etc/sentinel.conf //启动服务
持久化:RDB AOF
RDB:
定义RDB文件名: dbfilename “dump.rdb” //文件名
备份数据:备份dump.rdb文件到其他位置
]#cp 数据库目录/dump.rbd 备份目录
恢复数据:拷贝备份文件到数据库目录,重启redis服务
#/etc/init.d/redis_6379 stop //先停服务
#scp /var/lib/redis/6379/dump.rdb root@目标IP地址
:/var/lib/redis/6379/ //实现备份数据恢复
数据从内存保存到硬盘的频率
Save 900 1 //15分钟且有1个key改变
Save 300 10 //5分钟且有10个key改变
Save 60 10000 //1分钟且有10000个key改变
手动存盘:
Save //阻塞写存盘
Bgsave //不阻塞写存盘
AOF:追加方式写操作文件,记录redis服务写操作,新的写操作追加到文件的末尾.默认未启用,使用cat进行文件查看.
>config set appendonly yes //启用
>config get appendonly //查看状态
>config rewrite //永久写进配置文件
备份数据:备份appendonly.aof文件到其他位置
]#cp 数据库目录/applendonly.aof 备份目录
恢复数据:拷贝备份文件到数据库目录,重启redis服务
#/etc/init.d/redis_6379 stop //先停服务
#scp /var/lib/redis/6379/appendonly.aof root@目标IP地址:/var/lib/redis/6379/ //实现备份数据恢复
#/etc/redis/redis_6379 start
定义文件名:
Appendonly yes //启用aof,默认no
Appendfilename “appendonly.aof” //指定文件名
AOF文件记录写操作的方式
Appendfsync always //时时记录,并完成磁盘同步
Appendfsync everysec //每秒记录1次,并完成磁盘同步
Appendfsync no //写入aof,不执行磁盘同步
#redis-check-aof --fix appendonly.aof
Continue?:y
(启动这服务进行)
AOF缺点:持久化文件的体积通常会大于RDB方式.执行fsync策略时的速度可能会比RDB方式慢
数据类型分类
数据类型:string字符串,list列表,hash表
String字符串
Set key value
List列表