mysql专项笔记

文章目录

  • 一、mysql概述
      • 1、关系型数据库
      • 2、事务概述
      • 3、mysql介绍
      • 4、安装方式
  • 二、mysql安装
      • 1、基于glibc版本下载
      • 2、基于rpm安装
      • 3、基于源码安装
      • 重置管理员root密码
  • 三、SQL语句
  • 四、用户管理和权限管理
  • 五、mysql备份与恢复
    • 全库备份
    • 增量备份
  • 六、主从复制
  • 扩展
  • 原笔记

一、mysql概述

1、关系型数据库

关系型数据库是指采用了二维表格来组织数据的数据库。

常见的关系型数据库

oracle、mysql、SQL server(Microsoft微软)

最大特点:事务的一致性

2、事务概述

1.什么是事务?

1)事务由一条或者多条sql语句组成;

2)在事务中的操作,这些sql语句要么都成功执行,要么都不执行,这就是一个事务。

2.事务的特点(ACID)

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

3、mysql介绍

  • **社区版:MySQL Community Edition (GPL) **

  • **企业版:MySQL Enterprise Edition(commercial) **

  • **集群版:MySQL Cluster CGE(commercial) **

    Final 正式版本

    Release 发行版本

    Standard 标准版本

    Mini 迷你精简版本,只有最基本的功能

GA(GenerallyAvailable) 开发团队认为该版本是稳定版,可以在较为关键的场合使用。

主配置文件 /etc/my.cnf

4、安装方式

1.二进制方式安装

RPM版本

基于glibc版本

2.源代码编译安装

二、mysql安装

1、基于glibc版本下载

mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

二进制安装
1.关闭防火墙
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# vim /etc/selinux/config
SELINUX=disabled
2.更换阿里源
# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# yum clean all
# yum makecache
3.安装扩展软件(bash-completion自动补全、vim编辑器、net-tools网络工具包以及ntpdate时间同步工具)
# yum install bash-completion vim net-tools ntpdate -y
# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel
# yum install libaio -y
4.上传mysql安装包
# tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
5.最简单的安装
#useradd -r  -s /bin/false mysql #创建程序账号
#tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz #解压,跟上面的命令重复了
#mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql #移动
#cd /usr/local/mysql/
#mkdir mysql-files   #创建一个目录
#chown mysql:mysql mysql-files/
#chmod 750 mysql-files/
#rm -rf /etc/my.cnf  #删除主配置文件,不删除的话可能会导致初始化失败
#bin/mysqld --initialize --user=mysql  #初始化
   A temporary password is generated for root@localhost: fuYKYm*ds5sD #产生了随机密码

#bin/mysql_ssl_rsa_setup 
#bin/mysqld_safe --user=mysql &   #启动数据库并掉入后台执行
#cp support-files/mysql.server  /etc/init.d/mysql.server  #设置mysql的启动脚本
#netstat -nplt |grep 3306  #查看端口号

#bin/mysql -uroot -p    #登录mysql数据库

#mysql> set password="123";  #设置密码为123
#mysql> flush privileges;    #刷新权限

#把mysql客户端命令添加到环境变量,以后随时可以访问
# echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
# source  /etc/profile 

#验证服务是否能够正常关闭和启动

# service mysql.server start 
Starting MySQL. SUCCESS! 

# service mysql.server stop
Shutting down MySQL.. SUCCESS! 

#忘记密码怎么办?

#service mysql.server stop  #关闭数据库
# mysqld  --skip-grant-tables  --user=mysql &
# mysql #直接登陆数据库系统,不需要输入密码

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('123456')
WHERE user = 'root' AND host = 'localhost';
mysql> FLUSH PRIVILEGES;

#设置开机自启动(centos6)
# chkconfig --add mysql.server   #将mysql.server添加到chkconfig管理服务中
# chkconfig mysql.server  on     #设置mysql.server 在3、5级别是开机启动是on的
# chkconfig --list               #查看chkconfig管辖的服务启动情况。
mysql.server   	0:关	1:关	2:开	3:开	4:开	5:开	6:关
netconsole     	0:关	1:关	2:关	3:关	4:关	5:关	6:关
network        	0:关	1:关	2:开	3:开	4:开	5:开	6:关

#手动添加修改mysql的主配置文件(默认5.7之后的二进制版本没有my.cnf)
# vim /usr/local/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock

2、基于rpm安装

mysql-community-server-5.7.28-1.el7.x86_64.rpm

#yum -y install mysql-community-server-5.7.28-1.el7.x86_64.rpm

3、基于源码安装

mysql-5.7.31.tar.gz

1)安装相关依赖软件
# yum -y install ncurses-devel cmake libaio-devel openssl-devel
2)下载Boost库源代码(选做)
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
解压软件包
[root@node1 src]# pwd
/usr/src
[root@node1 src]# tar xf mysql-5.7.31.tar.gz
[root@node1 src]# cd mysql-5.7.31/
[root@node1 mysql-5.7.31]# pwd
/usr/src/mysql-5.7.31
[root@node1 mysql-5.7.31]# vim myconfig.sh 
cmake . \
-DCMAKE_INSTALL_PREFIX=/mysql_3307 \
-DMYSQL_DATADIR=/mysql_3307/data \
-DMYSQL_TCP_PORT=3307 \
-DMYSQL_UNIX_ADDR=/mysql_3307/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_SSL=system \
-DWITH_BOOST=/mysql_3307/boost \
-DDOWNLOAD_BOOST=1(如果已经下载好,则不用再次下载)

[root@node1 mysql-5.7.31]# chmod +x myconfig.sh
[root@node1 mysql-5.7.31]# ./myconfig.sh
[root@node1 mysql-5.7.31]# make && make install
[root@node1 mysql-5.7.31]# cd /mysql_3307
[root@node1 mysql_3307]# pwd
/mysql_3307
[root@node1 mysql_3307]# mkdir mysql-files
[root@node1 mysql_3307]# chown -R mysql:mysql /mysql_3307
[root@node1 mysql_3307]# chmod 750 mysql-files
[root@node1 mysql_3307]# bin/mysqld --initialize --user=mysql --basedir=/mysql_3307 --datadir=/mysql_3307/data
拷贝启动脚本到/etc/init.d/目录里
[root@node1 mysql_3307]# cp support-files/mysql.server /etc/init.d/mysql_3307
[root@node1 mysql_3307]# service mysql_3307 start
Starting MySQL. SUCCESS!
[root@node1 mysql_3307]# vim /mysql_3307/my.cnf
[mysqld]
basedir=/mysql_3307
datadir=/mysql_3307/data
socket=/mysql_3307/mysql.sock
[root@node1 mysql_3307]# bin/mysqladmin -uroot password '123' -p
Enter password:输入初始化临时产生的密码(不显示)

或者进入mysql后,设置密码
mysql> set password='456';

重置管理员root密码

#忘记密码怎么办?

#service mysql.server stop  #关闭数据库
# mysqld  --skip-grant-tables  --user=mysql &
# mysql #直接登陆数据库系统,不需要输入密码

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('123456')
WHERE user = 'root' AND host = 'localhost';
mysql> FLUSH PRIVILEGES;

mysql升级

[root@web ~]# systemctl stop httpd
[root@web ~]# mysqldump -u root -p --add-drop-table --all-databases --force > /tmp/old_data_full.sql

[root@web ~]# systemctl stop mysqld		//转储完毕,停止原数据库服务

三、SQL语句

数据库
创建
create database db1;
create database db1 default charset gbk;
删除
drop database db1;
修改
alter database db1 default charset=gbk;
查找
show databases;
show create database db1;


表
创建
mysql> create table tb_admin(
	id tinyint,
    username varchar(20),
    password char(32)
) engine=innodb default charset=utf8;
删除
drop table 数据表名称;
修改
alter table tb_article add addtime date after content;
alter table tb_admin change username user varchar(40);
alter table tb_admin modify user varchar(20);
alter table tb_article drop 字段名称;
alter table tb_article engine=myisam;
alter table tb_admin default charset=gbk;
查找
show tables;
show create table 数据表名称;
desc 数据表名称;


数据
mysql> insert into tb_user values (1,'李向阳',24,'男','广东省广州市');
mysql> insert into tb_user(id,username,age) values (2,'马鹏',23);
mysql> select * from 数据表名称 [where 查询条件];
mysql> select id,username,age from 数据表名称 [where 查询条件];
mysql> update tb_user set gender='男',address='广东省深圳市' where username='马鹏';
mysql> update tb_user set age=age+1;
mysql> delete from tb_user where id=1;
mysql> delete from 数据表;
或
mysql> truncate 数据表;

类型
整数
mysql> create table tb_student(
	id mediumint unsigned not null auto_increment,
	username varchar(20),
	age tinyint unsigned,
	mobile char(11),
	primary key(id)
) engine=innodb default charset=utf8;

小数 
  浮点类型   FLOAT单精度浮点数精确到约7位小数,DOUBLE双精度浮点数精确到大约15位小数
  定点类型   salary DECIMAL(5,2)
  mysql> create table tb_staff(
	id smallint unsigned not null auto_increment,
	username varchar(20),
	salary decimal(11,2),
	addtime date,
	primary key(id)
) engine=innodb default charset=utf8;

字符串
CHAR类型   定长,长度范围是0到255之间的任何值,一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes
VARCHAR类型  VARCHAR(M)字段存储实际是从第二个字节开始存储,然后用1到2个字节表示实际长度,剩下的才是可以存储数据
mysql> create table tb_news(
	id int not null auto_increment,
	title varchar(80),
	description varchar(255),
	addtime date,
	primary key(id)
) engine=innodb default charset=utf8;
TEXT类型   TEXT代表文本类型的数据
mysql> create table tb_goods(
  id int not null auto_increment,
  name varchar(80),
  price decimal(11,2),
  content text,
  primary key(id)
) engine=innodb default charset=utf8;
其他类型
BLOB:保存二进制的大型数据(字节串),没有字符集,eg:图片、音频视频等。
实际运维工作中,很少将文件直接保存在数据库端,一般文件的存储都是基于路径进行操作的。
ENUM枚举类型:多选一,从给定的多个选项中选择一个,如gender  enum('男','女','保密')
SET集合类型:多选多,从给定的多个选项中选个多个,如hobby set('吃饭','睡觉','打豆豆')

日期时间类型
now()
㈠ DATE类型(年-月-日)
㈡ DATETIME(年月日小时分钟秒)
㈢ TIMESTAMP(年月日小时分钟秒)
㈣ TIME(小时:分钟:秒)
㈤ YEAR
mysql> create table tb_article1(
	id int not null auto_increment,
	title varchar(80),
	description varchar(255),
	addtime datetime,
	primary key(id)
) engine=innodb default charset=utf8;

mysql> create table tb_article2(
	id int not null auto_increment,
	title varchar(80),
	description varchar(255),
	addtime timestamp,
	primary key(id)
) engine=innodb default charset=utf8;

mysql> insert into tb_article1 values (null,'mysql从入门到放弃','mysql很好很强大...',now());

sql查询语句
where
mysql> select * from tb_student where name like '关%';
mysql> select * from tb_student where name like '%蝉%';   %匹配多
mysql> select * from tb_student where name like '_云';    _匹配一个
mysql> select * from tb_student where id=3;
mysql> select * from tb_student where age>25;
mysql> select * from tb_student where gender<>'男';    <>和!=一个意思
mysql> select * from tb_student where id=1 or id=3 or id=5;
mysql> select * from tb_student where age>=18 and age<=25;
mysql> select * from tb_student where age between 18 and 25;
mysql> select * from tb_student where id in (2,4,6);
mysql> select distinct age from tb_student;  去掉重复的年龄

group by
mysql> select count(*) from tb_student;   
mysql> select max(age) from tb_student;
mysql> select min(age) from tb_student;
mysql> select sum(id) from tb_student;
mysql> select avg(age) from tb_student;
mysql> select gender,count(*) from tb_student group by gender;
mysql> select gender,max(age) from tb_student group by gender;

having
mysql> select * from tb_student having age>20;
mysql> select subject,count(*) from tb_student group by subject;
mysql> select subject,count(*) from tb_student group by subject having count(*)>3;

order by
mysql> select * from 数据表名称 ... order by 字段名称 asc;
mysql> select * from 数据表名称 ... order by 字段名称 desc;
mysql> select * from tb_student order by age desc;

limit
mysql> select * from 数据表名称 ... limit number; 查询满足条件的number条数据
或
mysql> select * from 数据表名称 ... limit offset,number; 从偏移量为offset开始查询,查询number条记录
offset的值从0开始
mysql> select * from tb_student order by age desc limit 1;
mysql> select * from tb_student limit 1,2;
mysql> select * from tb_student limit 0,2;
mysql> select * from tb_student limit 2,2;

多表查询
UNION联合查询
mysql> select * from tb_student1 union select * from tb_student2;

交叉查询
mysql> select */字段列表 from 数据表1,数据表2;
mysql> select */字段列表 from 数据表1 cross join 数据表2;
mysql> select * from tb_c cross join tb_goods;

内连接查询(重点)
mysql> select 数据表1.字段列表,数据表2.字段列表 from 数据表1 inner join 数据表2 on 连接条件;
mysql> select tb_goods.*,tb_c.name from tb_goods inner join tb_c on tb_goods.cid=tb_c.pid;

外连接查询(重点)
select 数据表1.字段列表,数据表2.字段列表 from 数据表1 left join 数据表2 on 连接条件;
select 数据表1.字段列表,数据表2.字段列表 from 数据表1 right join 数据表2 on 连接条件;
mysql> select tb_goods.*,tb_c.name from tb_goods left join tb_c on tb_goods.cid=tb_c.pid;

别名机制:简化内外连接
mysql> select tb_goods.*,tb_c.name from tb_goods left join tb_c on tb_goods.cid=tb_c.pid;
① mysql> select * from tb_goods left join tb_c;
起别名
② mysql> select * from tb_goods g left join tb_c c;
写on条件
③ mysql> select * from tb_goods g left join tb_c c on g.cid=c.id;
筛选字段
④ mysql> select g.*,c.name from tb_goods g left join tb_c c on g.cid=c.id;

四、用户管理和权限管理

mysql> select user,host from mysql.user;
mysql> create user '用户名'@'被允许连接的主机名称或主机的IP地址' identified by '用户密码';
mysql> create user 'tom'@'localhost' identified by '123';
或
mysql> create user 'tom'@'127.0.0.1' identified by '123';
mysql> create user 'harry'@'192.168.1.%' identified by '123';   --开通远程连接
mysql> create user 'jack'@'192.168.1.%' identified by '123';
mysql> create user 'root'@'%' identified by '123';

删除用户
drop user '用户名'@'主机名称或主机的IP地址';
mysql> drop user 'tom'@'localhost';
mysql> drop user 'jack'@'192.168.1.%';
mysql> create user 'harry'@'localhost' identified by '123';
mysql> create user 'harry'@'192.168.1.23' identified by '123';

mysql> drop user 'harry'@'192.168.1.23';

mysql> delete from mysql.user where user='root' and host='%';
mysql> flush privileges;

修改用户
mysql> rename user 旧用户信息 to 新用户信息;
mysql> rename user 'root'@'%' to 'root'@'10.1.1.%';

mysql> create user 'tom'@'localhost' identified by '123';
mysql> rename user 'tom'@'localhost' to 'harry'@'localhost';

mysql> update mysql.user set user='tom',host='localhost' where user='harry' and host='localhost';
mysql> flush privileges;

权限
select/update/delete/super/replication slave/reload...
USAGE	无权限,只有登录数据库,只可以使用test或test_*数据库
ALL		所有权限
mysql.user				所有mysql用户的账号和密码,以及用户对全库全表权限(*.*)
mysql.db				非mysql库的授权都保存在此(db.*)
mysql.table_priv		某库某表的授权(db.table)
mysql.columns_priv		某库某表某列的授权(db.table.col1)
mysql.procs_priv		某库存储过程的授权

授权
mysql> grant select on db1.* to 'tom'@'localhost';
mysql> flush privileges;

mysql> grant update(age) on db1.tb_student to 'tom'@'localhost';   指定表更新权限
mysql> flush privileges;

mysql> create user 'root'@'%' identified by '123';
mysql> grant all on *.* to 'root'@'%';
mysql> flush privileges;
以下语句实现了通过 grant 语句来分配创建、修改和删除 MySQL 数据表结构的权限。
grant create on testdb.* to lisi@’192.168.0.%’; 
grant alter on testdb.* to lisi@’192.168.0.%’; 
grant drop on testdb.* to lisi@’192.168.0.%’; 
分配创建 MySQL 外键权限。 
grant references on testdb.* to lisi@’192.168.0.%’; 
分配创建 MySQL 临时表权限。
grant create temporary tables on testdb.* to lisi@’192.168.0.%’; 
分配创建 MySQL 索引权限。
grant index on testdb.* to lisi@’192.168.0.%’; 
分配创建 MySQL 视图、查看视图源代码权限。
grant create view on testdb.* to lisi@’192.168.0.%’; 
grant show view on testdb.* to lisi@’192.168.0.%’; 
分配创建 MySQL 存储过程、函数权限。
grant create routine on testdb.* to lisi@’192.168.0.%’; — now, can show procedure status 
grant alter routine on testdb.* to lisi@’192.168.0.%’; — now, you can drop a procedure 
grant execute on testdb.* to lisi@’192.168.0.%’; 

查询权限
mysql> show grants;
mysql> show grants for '用户名称'@'授权的主机名称或IP地址';
with grant option选项作用:代表此账号可以为其他用户下发权限,但是下发的权限不能超过自身权限。
mysql> grant all on *.* to 'amy'@'192.168.1.%' identified by '123' with grant option;
mysql> grant all on *.* to 'harry'@'192.168.1.%' identified by '123'; 
SELECT * FROM mysql.user WHERE user='chushiyan'\G

grant使用
mysql> grant 权限 on 数据库.数据表 to '新用户名称'@'授权主机名称或IP地址' identified by '用户的密码';
mysql> grant all on *.* to 'root'@'%' identified by '123';

revoke使用
撤消指定的权限
mysql> revoke update on db01.* from 'tom'@'192.168.1.%';
撤消所有的权限
mysql> revoke all on db01.* from 'tom'@'192.168.1.%';
从tom账号中回收select权限
mysql> revoke select on db01.* from 'tom'@'localhost';
mysql> flush privileges;
mysql> show grants for 'tom'@'localhost';
从tom账号中回收update权限
mysql> revoke update(age) on db01.tb_student from 'tom'@'localhost';
mysql> flush privileges;
mysql> show grants for 'tom'@'localhost';

五、mysql备份与恢复

备份:防止机械故障,人为误操作的数据丢失,将文件保存在其他地方
冗余:不等于备份,只能防止机械故障的丢失。应用领域主备模式,数据库集群


查看数据的存放位置
mysql> show global variables like '%datadir%';

备份
mysql> create database db1 default charset=utf8;
mysql> use db1;
mysql> create table tb_student(
	id int not null auto_increment,
	name varchar(20),
	age tinyint unsigned default 0,
	gender enum('male','female'),
	subject enum('ui','java','yunwei','python'),
	primary key(id)
) engine=innodb default charset=utf8;

mysql> insert into tb_student values (null,'刘备',33,'male','java');
mysql> insert into tb_student values (null,'关羽',32,'male','yunwei');
mysql> insert into tb_student values (null,'张飞',30,'male','python');
mysql> insert into tb_student values (null,'貂蝉',18,'female','ui');
mysql> insert into tb_student values (null,'大乔',18,'female','ui');

# mkdir /tmp/sqlbak
# mysqldump db1 tb_student > /tmp/sqlbak/tb_student.sql -p123;

还原
# mysql 数据库名称 < .sql文件位置 -p
Enter password:123
或
# mysql -uroot -p
Enter password:123
mysql> use db1
mysql> source .sql文件的位置

库备份
# mysqldump --databases db1 > /tmp/sqlbak/db1.sql -p
Enter password:123
还原
# mysql < .sql文件位置 -p
Enter password:123
或
# mysql -uroot -p
Enter password:123
mysql> source .sql文件的位置

全库备份
# vim my.cnf
[mysqld]
...
server-id=10
log-bin=/usr/local/mysql/data/binlog

# service  mysql.server  restart

--flush-logs, -F        开始备份前刷新日志(二进制日志)binlog.000001 => binlog.000002
--flush-privileges      备份包含mysql数据库时刷新授权表 => 刷新用户和授权信息
--lock-all-tables, -x   MyISAM一致性,服务可用性(针对所有库所有表)
--lock-tables, -l       备份前锁表(针对要备份的库)
--single-transaction    适 用InnoDB引擎,保证一致性,服务可用性
--master-data=2         表示将二进制日志位置和文件名写入到备份文件并在dump文件中注释掉这一行
--master-data=1         表示将二进制日志位置和文件名写入到备份文件,在dump文件中不注释这一行
# mysqldump --all-databases --master-data --single-transaction > /tmp/sqlbak/all.sql -p
Enter password:123
还原
# mysql < all.sql -p
Enter password:123

1. mysqldump工具备份的是==SQL语句==,故备份不需要停服务
2. 使用备份文件==恢复==时,要保证==数据库处于运行状态==
3. 只能实现全库,指定库,表级别的==某一时刻的备份==,本身==不能增量备份==
4. 适用于==中小型==数据库

mysql内部的一个执行过程
宏观上:首先会通过连接器和mysql建立连接,然后在通过分析器,优化器和执行器最终返回一个执行结果,优化器会根据一些成本的计算然后去决定具体走哪个索引或者是连表的一些顺序最终会生成一个执行计划。执行器会根据和这个执行计划去调用存储引擎层的API接口,然后存储引擎层是一个可插拔的设计,不同的存储引擎会去实现一套统一的API接口,就可以自由的更换我们的存储引擎。上层是无感知

存储引擎
常用的有innodb,myisam,还有一个是memory,一个缓存型的存储引擎

innodb,myisam分别适用哪些场景
innodb它是一种事务型的存储引擎,然后我们的业务一般对可靠性是有要求的,基本上用的都是innodb.
myisam它是一种olap的存储引擎,适用于读多写少的环境,比如数仓t+1聚合的一些数据给到我们业务,业务就只用来读的,比如像支付宝的年度总结这个功能,用myisam查询下来会更快

myisam不支持事务,不支持外键,不支持行级锁,不写redo.log,但是会写二进制日志

为什么myisam的查询会比innodb更快
它们底层的存储结构还是有差别的,像myisam是非聚簇索引,它的所有索引最终存的数据都是我们具体的记录行的地址。就不用像innodb那样子再去回表,然后像innodb的每次查询还需要去维护一个mvcc的一个版本情况,就还是会比较慢

mysql执行过程中存储引擎执行细节
像innodb官方的一个架构图,主要就分为两大块,缓存和磁盘,就比如说要执行一个,我们要根据主键去修改某条数据的字段吧,然后我们就需要首先去查看索引,然后定位到具体的记录行,在此期间所有访问过的数据页,它都会加载到缓存中,我们修改的实际上是缓存中的值,我们被修改过的缓存页,被成为脏页,这些脏页是需要刷到磁盘中的,也叫刷脏,修改前还会修改一个undolog,在修改后会去记录一个redologo,包括我们事务的提交是一个两阶段的提交,首先我们事务的状态修改成perpare状态然后再去binlog进行一个刷盘之后再把我们存储引擎的事务状态改成一个commit的状态这个事务就基本完成


备份数据有哪些
数据文件,配置文件,日志文件

全库备份

xtabackup软件的安装
第一步:上传软件包及依赖库到Linux服务器端
第二步:安装依赖库
    # rpm -ivh libev-4.15-3.el7.x86_64.rpm
第三步:安装xtrabackup软件
    # yum install percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm -y
    # rpm -ql percona-xtrabackup-24

第一步:准备数据
mysql> create database db1 default charset=utf8;
mysql> use db1;
mysql> create table t1(id int,name varchar(10)) engine=myisam;
mysql> insert into t1 values (1,'吕布');
mysql> create table t2(id int,name varchar(10)) engine=innodb;
mysql> insert into t2 values (1,'貂蝉');
第二步:专门准备一个数据库备份账号,开通相应权限
创建备份用户admin,并授予相应权限
mysql> grant reload,process,lock tables,replication client on *.* to 'admin'@'localhost' identified by '123';
mysql> flush privileges;
修改mysql的主配置文件my.cnf,生成二进制文件
# vim my.cnf
[mysqld]
...
server-id=10
log-bin=/usr/local/mysql/data/binlog

# service  mysql.server  restart
第三步:使用innobackupex工具进行全库备份
# mkdir /var/lib/mysql
# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
# innobackupex --user=admin --password=123 /full_xtrabackup
第四步:预备阶段,把备份这段时间内产生的日志整合到全量备份中
# innobackupex --user=admin --password=123 --apply-log /full_xtrabackup/完整备份的文件
第五步:模拟数据库故障
# rm -rf /usr/local/mysql/data/*
# pkill mysqld
第六步:快速的恢复数据库中的数据
# rm -rf /usr/local/mysql/data/*
# chown -R mysql.mysql /usr/local/mysql/data 755
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /full_xtrabackup/2020-08-29_15-59-22
# innobackupex --copy-back /full_xtrabackup/2020-08-29_15-59-22
第八步:启动MySQL,测试其是否正常
# service mysql.server start
# mysql -p
Enter password:123

关于报错
1.

增量备份

第一步:准备数据
mysql> create database db1 default charset=utf8;
mysql> use db1;
mysql> create table t1(id int,name varchar(10)) engine=myisam;
mysql> insert into t1 values (1,'吕布');
mysql> create table t2(id int,name varchar(10)) engine=innodb;
mysql> insert into t2 values (1,'貂蝉');
第二步:创建一个账号,专门用于备份
创建备份用户admin,并授予相应权限
mysql> grant reload,process,lock tables,replication client on *.* to 'admin'@'localhost' identified by '123';
mysql> flush privileges;
第三步:全量备份
# rm -rf /full_xtrabackup/*
# innobackupex --user=admin --password=123 /full_xtrabackup
第四步:把全备过程中产生的日志进行整合(特别注意)
# innobackupex --user=admin --password=123 --apply-log --redo-only /full_xtrabackup/2020-08-29_17-06-48/
第五步:修改数据(进行增删改操作,让其产生增量数据)
mysql> insert into db1.t1 values (2,'王朗');
mysql> insert into db1.t1 values (3,'袁术');
第六步:做增量备份
# innobackupex --user=admin --password=123 --incremental /incre_backup --incremental-basedir=/full_xtrabackup/2020-08-29_17-06-48
第七步:把增量备份产生的数据以及日志文件整合到全量备份中
第7.1步  把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据
#innobackupex --apply-log /full_xtrabackup/2020-08-29_17-06-48
第八步:模拟数据库故障
# rm -rf /usr/local/mysql/data/*
# pkill mysqld
# rm -rf /usr/local/mysql/data/*
第九步:数据恢复
# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=admin --password=123 --copy-back /full_xtrabackup/2020-08-29_17-06-48

# chown -R mysql.mysql /usr/local/mysql/data

# service mysql.server  start
# mysql -p
Enter password:123

六、主从复制

传统AB复制

1、关闭防火墙
# systemctl stop firewalld
# systemctl disable firewalld
# systemctl list-unit-files|grep firewalld
# setenforce 0
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
2、配置yum源
3、安装mysql软件
master端
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
mysql -uroot -p 
mysql> set password="123456";
4、配置my.cnf
vim /usr/local/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/master.err
log-bin=/usr/local/mysql/data/binlog		=>	  一定要开启二进制日志
server-id=10
character_set_server=utf8mb4			 	=>    utf8mb4相当于utf8升级版
配置完成后,重启mysqld服务
# service mysqld restart
# chkconfig --add mysqld(mysql.server)
# chkconfig mysqld on (mysql.server)
5、配置从服务器slave
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
配置my.cnf文件
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/slave.err
relay-log=/usr/local/mysql/data/relaylog			=>    	开启中继日志
server-id=100
character_set_server=utf8mb4
6、把master主服务器的数据目录同步到slave从服务器
a. 把MASTER服务器中的mysqld停止掉
# service mysqld stop
b. 把MASTER服务器中的/usr/local/mysql/data目录下的auto.cnf文件删除
# rm -rf /usr/local/mysql/data/auto.cnf
c. 把MASTER服务器中/usr/local/mysql中的data目录拷贝一份到SLAVE从服务器的/usr/local/mysql目录
# rsync -av /usr/local/mysql/data [email protected]:/usr/local/mysql/
d. 同步完成后,把主服务器与从服务器中的mysqld启动
# service mysqld start
7、配置MASTER-SLAVE主从同步
a. 在MASTER主服务器中创建一个账号,专门用于实现数据同步
mysql> grant replication slave on *.* to 'slave'@'192.168.8.%' identified by '123';
b. 在MASTER中锁表,然后查看二进制文件的名称及位置
mysql> flush tables with read lock;
mysql> show master status;
c. 在SLAVE从服务器中,使用change master to指定主服务器,并实现数据同步
mysql> change master to master_host='192.168.8.138',master_user='slave',master_password='123',master_port=3306,master_log_file='binlog.000008',master_log_pos=619;
d. 启动slave数据同步
mysql> start slave;
mysql> show slave status\G
⑤ 主MASTER服务器解锁
mysql> unlock tables;

可能的报错
# chown -R mysql.mysql /usr/local/mysql
修改slave配置
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.8.138',master_user='slave',master_password='123',master_port=3306,master_log_file='binlog.000009',master_log_pos=154;

mysql> start slave;

扩展

索引同时也可能是一种约束
索引在MySQL中也叫做“键” ,也可理解为key,是存储引擎用于快速找到记录的一种数据结构。
唯一性索引,要求你的某个列的值必须唯一
主键索引,唯一性,非空,所以也是一种约束
除此之外,还有单独的一些约束 比如说 默认值约束
1.创建一个表,表的名字叫sanguo
2.表的字段有:
字段	类型	表的索引和约束
id	int	暂无
name	varchar(20)	暂无
zi	varchar(20)	暂无
events	text	暂无
3.需要插入的数据100万条记录
1001	刘备	玄德	他的事迹可多了,编草鞋,奉衣带诏,收编了两个小弟
1002	关羽	云长	杀颜良和文丑,在华容道放了曹操一马
1003	张飞	翼德	自古燕赵多义士,多了一个荆轲
1004	曹操	孟德	河南人,老奸巨猾
1005	孙尚香		嫁给了刘备,后来又跑回娘家了
1006	小乔	周瑜	嫁给了周瑜
4.在设置索引之前 查询一下 id为1005的记录
explain   select * from sanguo where id=1005 ;
5.设置索引 主键索引  
添加sanguo表的主键约束(主键索引)
alter table sanguo change id id int primary key ;
如何删除主键索引呢?
alter table sanguo drop  primary key ;
查看表的结构
desc sanguo;
添加索引之后,再次查看,扫描了几行
explain   select * from sanguo where id=1005 ;
如果按照name去查找记录的话,如果name这个字段有索引,走索引,如果没有,全表扫描
6. 设置唯一性索引,当我们创建好唯一性约束后,自动会创建唯一性索引如:
方法一
创建一个唯一性索引
alter table sanguo modify name char(20) unique;当然也可以单独创建唯一性索引
删除一个唯一性索引
alter table sanguo drop index name #默认唯一性索引的名字根列名保持一致

方法二
create unique index abc on sanguo(name);
接下来利用刚刚创建的唯一性索引查找名字为“张飞”的记录:
explain select * from sanguo where name="张飞"\G;  
注意:一般要给列(字段)设置索引
8. 设置普通索引
删除第7步的唯一性索引
alter table sanguo drop index abc;
再创建一个名字叫abc的普通索引
create index abc on sanguo(name);
接下来利用刚刚创建的唯一性索引查找名字为“张飞”的记录:
explain select * from sanguo where name="张飞"\G;  
9. 设置多列索引	
create index abc on sanguo(name(10),zi(5));
自行去验证:


创建索引,修改索引,查看和测试索引,删除索引。
添加sanguo表的主键约束(主键索引)
alter table sanguo change id id int primary key ;

如何删除主键索引呢?
alter table sanguo drop  primary key ;
查看表的结构
desc sanguo;
添加索引之后,再次查看,扫描了几行
explain   select * from sanguo where id=1005 ;
如果按照name去查找记录的话,如果name这个字段有索引,走索引,如果没有,全表扫描
--创建普通索引示例:
CREATE TABLE department10 (
dept_id INT,
dept_name VARCHAR(30),
comment VARCHAR(50),
INDEX index_dept_name (dept_name)
);
--创建唯一索引示例:
CREATE TABLE department11 (
dept_id INT,
dept_name VARCHAR(30),
comment VARCHAR(50),
UNIQUE INDEX index_dept_name (dept_name)
);
--创建全文索引示例:
CREATE TABLE department12 (
dept_id INT,
dept_name VARCHAR(30),
comment VARCHAR(50),
log text, 
FULLTEXT INDEX index_log (log)
);
(2)创建表之后建立索引
--1、创建普通索引示例:
CREATE INDEX index_dept_name ON department (dept_name);
--2、创建唯一索引示例:
CREATE UNIQUE INDEX index_dept_name ON department (dept_name);
--3、创建全文索引示例:
CREATE FULLTEXT INDEX index_dept_name ON department (dept_name);
--4、创建多列索引示例:
CREATE INDEX index_dept_name_comment ON department (dept_name,comment);



查询一下 id为1005的记录
explain   select * from sanguo where id=1005 ;
查看索引:
show create table 表名\G
explain select * from department where dept_name='HR';
删除索引
show create table employee; --首先查看创建表的结构,知道了索引名才可以删除哦
drop index 索引名 on 表名;

普通索引增删查改
CREATE INDEX index_dept_name ON department (dept_name);
删除第7步的唯一性索引
alter table sanguo drop index abc;
再创建一个名字叫abc的普通索引
create index abc on sanguo(name);

唯一性索引
创建一个唯一性索引
alter table sanguo modify name char(20) unique;当然也可以单独创建唯一性索引
CREATE UNIQUE INDEX index_dept_name ON department (dept_name);
删除一个唯一性索引
alter table sanguo drop index name #默认唯一性索引的名字根列名保持一致

主键索引
添加sanguo表的主键约束(主键索引)
alter table sanguo change id id int primary key ;
如何删除主键索引呢?
alter table sanguo drop  primary key ;
查看表的结构
desc sanguo;
添加索引之后,再次查看,扫描了几行
explain   select * from sanguo where id=1005 ;

创建多列索引示例:
CREATE INDEX index_dept_name_comment ON department (dept_name,comment);
create index abc on sanguo(name(10),zi(5));

原笔记

一、数据库概述
	1、定义
		数据库(database)是按照数据结构组织、存储和管理数据的仓库。
		数据库管理系统(database management  system),简称DBMS,用来管理数据库
	2、DBMS类型
		Oracle、Mysql、MariaDB、SQL Server、PostgreSQL等 
	3、数据管理模型
		层次模型
			按照层次结构的形式组织数据库数据的模型
			代表:IBM  IMS 
			缺点:产生大量冗余数据  
		网状模型 
			按照网状结构的形式组织数据库数据的模型 
			代表:CODASYL   DBTG 
			缺点:后期维护成本过高 
		关系模型
			按照关系结构的形式组织数据库数据的模型 
			代表:Oracle、Mysql、MariaDB、SQL Server、PostgreSQL			
			关系式(relational)数据库管理系统,简称RDBMS 
	4、数据存储
		a、可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存储数据库某个字段
		b、将图片转换成二进制流,直接存储到数据库的特定类型字段中(base64,将二进制的图片转换为文本编码)
	5、数据类型
		结构化数据
			可以使用关系型数据库表示和存储,表现为二维的数据(行、列)
		半结构化数据
			结构化数据的一种形式,同一类的实体可以有不同的属性,并且可以按照不同的顺序进行组合。
			子描述结构,如:XML和JSON
			
				zhangsan
				2000
				male
						
		非结构化数据
			没有预先定义好的数据模型或者预先定义的方式来组织和存储数据
			如:图片、音频、视频等			
		范式:(normal form)1NF,2NF,3NF,BCNF、4NF、5NF
	6、二维模型
		表:row  行   column  列
		索引:index
		视图:view	
	7、SQL
		结构化查询语言 ,用于管理 关系式数据库管理系统(RDBMS) 的语言	
		SQL接口:类似于OS中SHELL
		1986,ANSI推出SQL-86,89,92,1999,2003,2006,2008,2011,2016,2019
		PL-SQL:过程化SQL语言,是Oracle数据库对SQL语句的扩展 
		T-SQL:微软SQL Server数据库对SQL语句的扩展

		DDL:数据定义语言,实现对数据库、表的操作,如CREATE、ALTER、DROP、SHOW
		DML:数据操纵语言,实现对表中的数据的操作,如INSERT、DELETE、UPDATE、SELECT
	8、权限
		用户:用户名、密码
		权限:
			管理类
			数据库类
			数据表类
			字段	
	9、DBMS类型
		MySQL:
			最流行的开源数据库,使用GPL协议		
		MariaDB:
			是MySQL的分支,使用BSD协议
		PostgreSQL:pgSQL
			功能最强大的开源数据库,使用BSD协议	
		AliSQL:
			MySQL官方版本的分支		
			OceanBase 
		SQLite				
	10、事务
		a、定义
			是访问并可能操作各种数据项的一个数据库操作序列,是一个不可分割的工作单位
			要么全部执行,要么全部不执行,执行失败则回滚(rollback)
		b、ACID
			atomicity	 原子性,或不可分割性
				表示事务是不可分割的单位  
			consistency  一致性
				事务执行结果必须是从一个一致性状态到另一个一致性状态
			isolation	隔离性
				事务之间是隔离的,一个事务的运行不能影响其它事务的运行效果
			durability	 持久性
				事务一旦提交,它对数据库的改变就应该是永久的
一、概述
	1、存储引擎
		将底层的文件系统抽象成关系模型的组件
		MySQL使用插件式存储引擎

		5.5	innodb存储引擎
		5.1	MyISAM

	2、约束
		主键约束:一个或多个字段的组合,填入主键中的数据,必须不同于已存在的数据,不能为空,一个表只能包含一个主键
			键、超键、候选键、主键 
		唯一键约束:一个或多个字段的组合,填入唯一键中的数据,必须不同于已存在的数据,可以为空,一个表可以包含多个唯一键
			
		外键约束:一个表中某个字段插入的数据,取决于另外一张表的主键中的数据 

		检查性约束:取决于表达式的要求
			
	3、索引
		关系式数据库中对某一列或多列的值进行与排序的数据结构
		
		数据结构:
			B-Tree	
			hash

二、MariaDB
	Mysql分支:
		MariaDB	
		Percona server
		MySQL community server:Mysql的社区版本 
	安装方式:
		RPM
			OS提供版本
			官网版本  mariadb.org
		源代码
	特性:
		支持更丰富的存储引擎
			MyISAM:5.1版本之前的默认存储引擎;表级锁;
			InnoDB:5.5版本之后默认存储引擎;行级锁;外键
		支持扩展和新功能
		提供较多的测试组件

	安装:
		[root@localhost ~]# yum -y install mariadb mariadb-server
		[root@localhost ~]# systemctl start mariadb.service
	架构:C/S
		C:客户端
			mysql 		CLI交互式客户端程序 
			mysqldump	备份工具
			mysqladmin	管理工具	
			mysqlbinlog	二进制日志管理工具
			……
		S:服务器端
			mysqld		服务器端主程序
			mysqld_safe	mysqld的父进程 
			mysqld_multi	多实例启动
	套接字地址
		IPv4 | IPv6 : TCP 3306端口
		unix_sock :/var/lib/mysql/mysql.sock	 /tmp/mysql.sock
	配置文件设置:
		用一个文件为多个程序提供配置	
		[mysql]		
		[mysqld]
		[mysqld_safe]
		[server]	
		[client]
		[mysqldump]
		……
	配置文件:
		/etc/my.cnf
		/etc/my.cnf.d
		应用顺序:
		1./etc/mysql/my.cnf 
		2./etc/my.cnf (/etc/my.cnf.d)
		3.~/.my.cnf 
		读取所有的配置文件,并且最后的读取的参数为最终生效的参数
	常用命令:
		客户端命令
			mysql
			作用:访问服务器提供的默认的交互接口,从而进入SQL SHELL
			格式:mysql  选项  参数
			选项:
				u	指定用户名,默认用户名root
				h	指定主机名,默认主机名localhost
					客户端访问服务器时,请求的IP会被反向解析为主机名,可能造成访问失败
					取消该功能:--skip-name-resolve 
				p	指定当前用户的密码,默认为空
				P	指定当前服务器的监听端口,默认TCP/3306
				S	指定套接字文件,默认mysql.sock	
				D	指定默认登录的数据库
				e	不登录,执行特定数据库操作

			注意事项:
				%:匹配任意长度的任意字符
					172.16.%.%    	172.16.0.0/16
					%		任意远端地址
				_:匹配任意单个字符
		服务器端命令
			基本指令:
				\u	设置默认数据库
				\q	退出数据库
				\c	打断当前命令 
				\g	横排显示结果,默认值
				\G	竖排显示结果
				\d	设定结束符,默认是 分号 ;
				\!	使用SHELL命令
				\.	调用脚本文件	
			查看帮助:
				MariaDB [mysql]> help contents;
				MariaDB [mysql]> help Data Types;
一、数据类型
	1、表:行和列
		创建表:定义表中字段
		设置字段名、数据类型、约束条件等

	2、字段
		数据的存储格式(字符串、整数、浮点数)
		能够参与运算的种类
		可表示的有效的数据范围

	3、字符型:字符集
		字符和二进制数字之间建立映射关系
		如:UTF-8、GBK
		排序

		SHOW  CHARACTER SET;	查看字符集 
		SHOW  COLLATION;	查看字符集排序

	4、字符类型	
		定长字符型
			CHAR(#):不区分字符大小写
			BINARY(#):区分字符大小写
			
			#代表字符的个数,最大为256个字符 
			CHAR支持字符集
			BINARY不支持字符集,其保存的是二进制字符串
		变长字符型
			VARCHAR(#):不区分字符大小写
			VARBINARY(#):区分字符大小写
				
			结束符:通常是1到2个字符空间
			最大长度:2^16  65535
			
		对象存储
			TEXT:不区分字符大小写
				TinyTEXT:2^8
				TEXT:2^16
				MediumTEXT:2^24
				LongTEXT:2^32
			BLOB:区分字符大小写
				TinyBLOB:2^8
				BLOB:2^16
				MediumBLOB:2^24
				LongBLOB:2^32				
		内置类型 
			SET:集合
			ENUM:枚举	
			
			ENUM:索引引用	最多65535,通常不超过20
			SET:二进制引用	最多64

		数值类型
			精确数值型
				INT
					TinyINT:1字节,0-255(无符号),-128至127(有符号),小的整数型
					SmallINT:2字节,0-65535
					MediumINT:3字节
					INT或INTEGER:4字节
					BITINT:8字节			
				DECIMAL 
					不存在精度损失,常用银行账目计算 
					DECIMAL(M,D) 
						M设定精度,范围1-65,默认是10
						D设定小数位,范围0-30,不能大于M,默认值是0
			近似数值型
				FLOAT:单精度(1,8,23),能保证6位十进制数字的精确度(小数位)
				DOUBLE:双精度(1,11,52),能保证15位十进制数字的精确度(小数位)

				浮点数:符号位、指数位、小数位 
					指数位:设定取值范围
					小数位:设定数据精度
		日期时间型 
			日期型:DATE  	YYYY-MM-DD
			时间型:TIME   	HH:MM:SS
			日期时间型:DATETIME	YYYY-MM-DD HH:MM:SS
			时间戳:TIMESTAMP	UNIX元年和格林威治时间   4字节  1970-01-01 至 2038-01-19   
			年份:YEAR(2)、YEAR(4)	YYYY   


		数据修饰符
			UNSIGNED:无符号,整数可以使用它禁用负数
			NOT  NULL:非空,插入数据时,该字段不能留空
			NULL:可以留空
			DEFAULT value:插入数据时,若未指定数据,则使用该默认值
			
			PRIMARY KEY:主键 
			UNIQUE KEY:唯一键
			FOREIGN KEY:外键

二、数据库管理
	1、服务器端指令:
		DDL:数据定义语言,主要用于管理数据库组件,如CREATE、ALTER、DROP
		DML:数据操纵语言,主要用于管理表中的数据,如INSERT、DELETE、UPDATE、SELECT
	2、库管理
		创建
			CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
			[DEFAULT] CHARACTER SET [=] charset_name
			[DEFAULT] COLLATE [=] collation_name
			
			CHARACTER SET:指定字符集  SHOW CHARACTER SET;
			COLLATE:指定排序   SHOW COLLATION;
			
			MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS aa;
			MariaDB [(none)]> SHOW WARNINGS;
		
			[root@localhost mysql]# sudo -u mysql mkdir /var/lib/mysql/bb

		修改
			ALTER {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
			[DEFAULT] CHARACTER SET [=] charset_name
			[DEFAULT] COLLATE [=] collation_name	

		删除
			DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

			删除前,可将目录移动到备份目录中一段时间
		查询
			SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]

			MariaDB [(none)]> SHOW DATABASES;
		
			MariaDB [(none)]> SHOW DATABASES LIKE '%b';
DDL:数据定义语言
DML:数据操纵语言

数据库:DATABASE
	CREATE DATABASE db_name
	
	IF NOT EXISTS 
	
	SHOW WARNINGS

	ALTER DATABASE db_name CHARACTER SET ‘gbk’;

	ALTER DATABASE db_name COLLATE=

	DROP  DATABASE  db_name

	SHOW DATABASES 

数据表:TABLE
	
	MariaDB [(none)]> HELP CREATE TABLE;
	
	CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
   		 (create_definition,...)
   	 	[table_options]
    		[partition_options]

	CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    		[(create_definition,...)]
    		[table_options]
    		[partition_options]
    		select_statement

	CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    		{ LIKE old_tbl_name | (LIKE old_tbl_name) }

一、数据表管理

	1、创建数据表的方式
		a、直接创建
		b、通过查询现有的数据表创建(新表会被插入查询而来的数据)
		c、通过复制现有的数据表结构进行创建(只复制表结构,不复制表中数据)

	2、直接创建
		CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
   			 (create_definition,...)	# 创建定义
   	 		[table_options]		# 指定表选项
    			[partition_options]		# 指定分区选项

		创建定义:
			字段:
				字段名
				数据类型
			键:
				PRIMARY  KEY	主键
				UNIQUE  KEY 	唯一键
				FOREIGN  KEY 	外键
			索引:
				KEY | INDEX  [index_name]

		指定表选项:
			ENGINE = 存储引擎的名称	
			AUTO_INCREMENT = 设定自增长字段的初始值,默认为1
			
		分区选项:
			水平分区:
			垂直分区:
		

		查看数据表		
			MariaDB [mydb]> SHOW TABLES;	#查看指定库中的数据表的列表
			MariaDB [mydb]> DESCRIBE tb1;	#查看数据表的结构
			MariaDB [mydb]> DESC tb1;				
		
			Field :字段
			Type :字段/数据类型
			NULL :是否允许为空
			KEY :  键类型
			DEFAULT:是否包含默认值以及默认值的内容
			EXTRA:是否包含额外的参数 

			MariaDB [(none)]> USE mydb;

			MariaDB [mydb]> CREATE TABLE tb1 (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name 			VARCHAR(20) NOT NULL DEFAULT 'none');
		
			MariaDB [mydb]> DESCRIBE tb1;

			MariaDB [mydb]> CREATE TABLE tb2 (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name 			VARCHAR(20) NOT NULL UNIQUE KEY);

	2、通过查询现有的数据表创建
		CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name  select_statement

		SELECT : 查看指定表中指定字段的数据信息
		格式:SELECT  字段  FROM  数据表;
		MariaDB [mydb]> SELECT * FROM tb1;

		INSERT:向指定数据表中插入数据
		格式:
			格式一:INSERT INTO 表名 (字段1,字段2……) VALUES (字段1值,字段2值……);    	# 字符串必须加 ‘ ’ , 数字必须不加引号  
			MariaDB [mydb]> INSERT INTO tb1 (name) VALUES ('zhao');
			格式二:INSERT INTO 表名   VALUES  (字段1值,字段2值,…… 字段N值), (字段1值,字段2值,…… 字段N值);
			MariaDB [mydb]> INSERT INTO tb1 VALUES  (1,'zhangsan'),(2,'lisi'); 
			格式三:INSERT INTO 表名  (字段1,字段2……) SELECT  字段  FROM 表名;
			MariaDB [mydb]> INSERT INTO tb2 (id,name) SELECT id,name FROM tb5;

		创建表:
		MariaDB [mydb]> CREATE TABLE tb4 SELECT id,name FROM tb1;

	3、通过复制现有的数据表结构进行创建
		CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    		{ LIKE old_tbl_name | (LIKE old_tbl_name) }		
				
		MariaDB [mydb]> CREATE TABLE tb5 LIKE tb1;

		UPDATE:修改指定数据表中的数据
		格式:UPDATE  表名  SET 字段1=字段1值 WHERE 字段1=字段1值 
		MariaDB [mydb]> UPDATE tb2 SET id=8,name='a8' WHERE id=4;
		MariaDB [mydb]> UPDATE tb1 SET name='xxx' WHERE id BETWEEN 1 AND 3;

		DELETE:删除指定数据表中的数据 
		MariaDB [mydb]> DELETE FROM tb1 WHERE id=1;

	4、查看数据表的详细信息
		MariaDB [mydb]> SHOW TABLE STATUS LIKE 'tb5'\G
	
		Engine: InnoDB		当前数据表的存储引擎
		Rows: 7			当前数据表中的总行数
		Avg_row_length: 2340	每行平均字节数
		Data_length: 16384		数据表中数据的总的字节数
		Collation: latin1_swedish_ci	当前数据表的字符集的排序规则
		
		MariaDB [mydb]> SHOW TABLE STATUS WHERE ENGINE='innoDB'\G

	5、修改数据表
		ALTER 
			修改表名:
			MariaDB [mydb]> ALTER TABLE tb5 rename tb6;
			添加字段:first、after
			MariaDB [mydb]> ALTER TABLE tb6 ADD gender ENUM('Fmale','male');
			MariaDB [mydb]> ALTER TABLE tb6 ADD gender ENUM('Fmale','male') first;
			MariaDB [mydb]> ALTER TABLE tb6 ADD gender ENUM('Fmale','male') after id;
			修改字段:
			MariaDB [mydb]> ALTER TABLE tb6 CHANGE id stuid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT;
			MariaDB [mydb]> ALTER TABLE tb6 MODIFY stuid INT UNSIGNED NOT NULL AUTO_INCREMENT;
			删除字段:
			MariaDB [mydb]> ALTER TABLE tb6 DROP gender;
			
	6、键 
		添加
			MariaDB [mydb]> ALTER TABLE tb8 ADD PRIMARY KEY(id);		#添加主键
			MariaDB [mydb]> ALTER TABLE tb8 ADD UNIQUE KEY(name);	#添加唯一键

		删除
			MariaDB [mydb]> ALTER TABLE tb8 DROP PRIMARY KEY;		#删除主键
			MariaDB [mydb]> ALTER TABLE tb8 DROP INDEX name;		#删除唯一键

		
	7、删除数据表
		MariaDB [mydb]> DROP TABLE tb8;
一、数据库的基础架构
	1、连接器
		JDBC:JAVA数据库互联  
		ODBC:开放数据库互联 
	2、进程管理
		单进程多线程模型
		
			长连接:mysql
			短链接:mysql -e

	3、组件
		SQL Interface:完整的SQL语法的解释器
		Parser:分析器	
			用户接入时,验证用户信息,发送SQL语句
			用户接入后,验证其是否有权限获取它所请求的资源
		Optimizer:优化器
		Engines:存储引擎
			MyISAM、InnoDB、NDB、Archive、Federated、Memory、Merge
	
	4、文件
		Redo:重做日志
		undo:回滚日志
		date:数据文件
		index:索引文件
		binary:二进制文件 
		error:错误日志
		query and slow:查询日志和慢查询日志

	5、管理工具
		备份&还原工具
		安全工具
		复制工具
		集群工具
		管理工具
		迁移工具&元数据管理

二、索引管理
	1、定义
		帮助MySQL高效获取数据的数据结构
		指针,指向数据源	
	2、类型
		B-Tree、Hash等
	3、创建方法
		创建表时指定
		修改表时指定
	4、查看
		SHOW {INDEX | INDEXES | KEYS}
   			{FROM | IN} tbl_name
   			[{FROM | IN} db_name]
    			[WHERE expr]
		
	
		MariaDB [mydb]> EXPLAIN SELECT * FROM tb1 WHERE id=5\G

			TYPE:const、system、ref、eq_ref、all
			ROWS:查询到指定数据检查了多少行
一、权限
	1、权限分类
		库级别:能否修改指定库
		表级别:能否修改指定表
		字段级别:能否修改指定数据字段

		管理类:能否创建其它用户,并且是否允许用户将获取的授权转赠于其它用户使用。
		程序类:是否有权限去运行某个存储函数、存储过程

		

		管理类:
			CREATE TEMPORARY TABLE		创建临时表(MEMORY引擎)
			CREATE USER			创建用户 
			FILE				将数据库中的数据,导出到文件中;或将文件中的内容,导入到数据库中
			SUPER				允许执行数据库的特殊管理命令
			SHOW DATRABASES		查看数据库列表
			RELOAD 				重新加载授权表,如FLUSH PRIVILEGES;
			SHUTDOWN 			关闭数据库的权限
			REPLICATION SLAVE		允许用户在SLAVE主机上连接MASTER,以便建立主从关系
			REPLICATION CLIENT		允许在主从关系中,执行查询指令
			LOCK TABLES			设置锁级别
			PROCESS				与进程本身相关的
	
		程序类:
			FUNCTION			函数
			PROCEDURE			存储过程		store procedure
			TRIGGER				触发器
		
			CREATE 、ALTER、DROP、EXCUTE

		库表类:
			CREATE
			ALTER
			CREATE VIEW 
			SHOW VIEW 
			DROP 
			INDEX
			GRANT OPTION	

		数据类:
			INSERT
			DELETE
			SELECT
			UPDATE

		字段类:
			INSERT(字段1,字段2 ……)
			SELECT(字段1,字段2 ……)
			UPDATE(字段1,字段2 ……)
			
		所有权限:ALL PRIVILEGES,简称ALL

	2、授权表
		主要存放在MySQL元数据 数据库 中
		db、host、user
		columns_priv、tables_priv、procs_priv、proxies_priv

二、用户管理
	1、用户格式:
		'username'@'host'
		
		username:用户名
		host:
			主机名				'stu'@'192.168.1.1'   'stu'@'www.hr.com'
			IP地址或网络地址
			通配符
				%	任意位任意字符  	192.168.%.%
				_	任意单个字符	192.1_8.1.1
	2、创建用户
		格式:
			MariaDB [mysql]> CREATE USER 'stu'@'%' IDENTIFIED BY '123';   		允许stu从任意远端服务器上登录本机   
			MariaDB [(none)]> CREATE USER 'test'@'localhost' IDENTIFIED BY '123';	允许test从本地主机登录

		查看用户默认权限:
			MariaDB [(none)]> SHOW GRANTS FOR 'test'@'localhost';
			usage属于最小权限,仅具有连接数据库和查询基本信息的权限

		重命名:
			MariaDB [(none)]> RENAME USER 'test'@'localhost' TO 'stu1'@'localhost';

		删除用户:
			MariaDB [(none)]> SELECT * FROM mysql.user\G
			MariaDB [(none)]> DROP USER 'stu'@'%';
			MariaDB [(none)]> select * from mysql.user\G


	3、密码管理
		a、设置管理员密码
			[root@localhost ~]# mysqladmin -uroot password
		b、管理员为普通用户修改密码
			MariaDB [(none)]> SET PASSWORD FOR 'stu1'@'localhost'=PASSWORD('123456');
		c、用户修改自己密码
			MariaDB [(none)]> SET PASSWORD = PASSWORD('123');
		d、管理员找回密码
			[root@localhost ~]# systemctl stop mariadb
			[root@localhost ~]# vim /etc/my.cnf
						[mysqld]
						skip-grant-table
						skip-networking
			[root@localhost ~]# systemctl start mariadb
	
			MariaDB [(none)]> UPDATE mysql.user SET PASSWORD=PASSWORD('1234') WHERE user='root';

			[root@localhost ~]# systemctl stop mariadb

			[root@localhost ~]# vim /etc/my.cnf
						删除skip的配置项

			[root@localhost ~]# systemctl start mariadb

	
三、授权管理
	1、格式:
		GRANT
    			priv_type [(column_list)]
      			[, priv_type [(column_list)]] ...
    			ON [object_type] priv_level
    			TO user_specification [, user_specification] ...
    			[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    			[WITH with_option ...]

			priv_type 	权限类型
				CREATE、DELETE等

			object_type 对象类型
				TABLE		表
				FUNCTION	函数
				PROCEDURE	存储过程

			priv_level 权限级别
				*    			所有库
				*.*			所有库中所有表
				db_name.*		指定库中的所有表
				db_name.tbl_name		指定库中的指定表
				tbl_name			指定表

			SSL:额外的加密支持
			
			with_option:资源访问限制
			    	GRANT OPTION				用户获取的权限是否可分配给他人
				MAX_QUERIES_PER_HOUR count		指定用户每小时能支持的最大查询数
				MAX_UPDATES_PER_HOUR count		指定用户每小时能支持的最大更新数
				MAX_CONNECTIONS_PER_HOUR count		指定每小时能支持的最大连接数
				MAX_USER_CONNECTIONS count		指定单个用户每小时能支持的最大连接数	
	
	2、授权

		MariaDB [(none)]> GRANT CREATE,DROP ON *.* TO 'stu1'@'localhost';	
		MariaDB [(none)]> SHOW GRANTS FOR 'stu1'@'localhost';

		测试:

	3、撤销权限
		
		MariaDB [(none)]> REVOKE DROP ON *.* FROM 'stu1'@'localhost';
逻辑架构:存储块、SQL接口、存储引擎等
物理架构:数据文件、索引文件、日志文件

一、概述
	1、innodb
		.frm	保存每个表的元数据  
		.ibd	存储每个表中的数据及索引信息
	2、MyISAM
		.frm	保存每个表的元数据 
		.myd	存储表中的数据
		.myi	存储表中的索引信息
	3、日志文件类型
		查询日志:query  log
		慢查询日志:slow query log
		错误日志:error  log
		二进制日志:binary log	
		中继日志:relay  log
		事务日志:transaction  log

二、日志文件的配置
	1、查询日志 
		作用:记录每个查询语句执行的结果 
		
		查询操作的记录方式:
		文件:FILE
		表:TABLE 

		MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE "%log%";
		MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE "%general%";
	
		general_log = ON|OFF			是否启用查询日志
		general_log_file = /PATH/FILE			查询日志的文件名及位置
		log_output = FILE | TABLE | NONE		NONE表示不记录查询日志 

		修改默认值:
			临时修改:
				MariaDB [(none)]> SET GLOBAL general_log=ON;
			永久修改:
				[root@localhost ~]# vim /etc/my.cnf
					[mysqld]
					general_log=ON
				[root@localhost ~]# systemctl restart mariadb

		查看当前值:
			MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE "%general%";
			MariaDB [(none)]> SELECT @@GLOBAL.general_log;
				服务器内置变量使用@@
				用户自定义变量使用@
				GLOBAL表示全局变量

	2、慢查询日志
		作用:记录超过指定时长的查询操作

		MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE "%slow_query%";

		slow_query_log = ON|OFF			是否启用慢查询日志
		slow_query_log_file = /PATH/FILE		慢查询日志的文件名及位置
		long_query_time = 10			指定慢查询的时长
		log_slow_queries 				是否启用慢查询日志

		MariaDB [(none)]> SET GLOBAL long_query_time=5;

		log_slow_filter				日志过滤器,设置将哪些查询操作记录到慢查询日志中
		log_slow_rate_limit 				设置慢查询日志的速率
		log_slow_verbosity 				设置慢查询日志中内容的详细程度 (query_plan,explain等) 

	3、错误日志
		作用:
			记录运行过程中产生的错误信息
			记录mysqld启动和关闭过程中产生的事件信息
			主从复制架构中,记录从服务器启动线程时产生的信息

		log_error = /PATH/FILE			错误日志的文件名及位置 
		log_warnings = 1|0				是否记录警告信息到错误日志中

	4、二进制日志
		作用:记录有可能引起数据库内容更改的查询语句
		功能:通过“重做”可以生成和源数据完全一致的数据副本 		

		启用二进制日志:
			vim  /etc/my.cnf
				[mysqld]
				log_bin=mysql-bin
		查看二进制日志:
			文件系统中查看:
				位置:/var/lib/mysql
				类型:
					二进制文件:mysql-bin.xxxxxx(二进制类型)
					索引文件:mysql-bin.index(文本类型)

				服务器重启时,会滚动生成新的二进制文件
			
			数据库中查看:
				MariaDB [(none)]> SHOW BINARY LOGS;
				MariaDB [(none)]> SHOW MASTER LOGS;
				显示当前数据库中能够识别的所有二进制日志文件的文件名及大小(字节)

				MariaDB [(none)]> SHOW MASTER STATUS;
				查看当前正在使用的二进制文件名

		查看二进制日志的内容:
			格式:
				SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

			示例:
				MariaDB [(none)]> SHOW BINLOG EVENTS IN 'mysql-bin.000002';
				
				Log_name 			二进制日志文件的文件名
				Pos 				事件的起始位置(字节)
				Query 				事件的类型
				Server_id				服务器ID
				End_log_pos			事件的结束位置(下一个事件的起始位置)
				Info 				相关事件的详细信息(包含 具体的操作内容 )

				MariaDB [aa]> SHOW BINLOG EVENTS IN 'mysql-bin.000002' FROM 245;		#从245位置开始显示
				MariaDB [aa]> SHOW BINLOG EVENTS IN 'mysql-bin.000002' LIMIT 2;			#显示首部2行
				MariaDB [aa]> SHOW BINLOG EVENTS IN 'mysql-bin.000002' LIMIT 3,2;		#从第4行开始,显示2行

		二进制日志相关变量:
		
			log_bin  =  ON|OFF		指定二进制日志文件的文件名及位置
			sql_log_bin  = ON|OFF	是否启用二进制日志
			binlog_format  = STATEMENT|ROW|MIXED 	基于语句|基于行|基于混合模式	
			max_binlog_size = 		设置单个二进制日志文件的最大体积,单位字节
				达到指定的最大值时滚动生成新日志文件
				文件可能未达到最大体积时生成新日志文件

			log_bin_trust_function_creators=0|1 	是否可以信任函数的创建者。 0表示用户不得创建或修改函数,1表示可以创建和修改函数 

		通过工具管理二进制文件
			mysqlbinlog:用于处理二进制文件的客户端命令工具  

			[root@localhost mysql]# mysqlbinlog mysql-bin.000002 

			/*!*/			分隔符,分隔显示多个事件的信息
			at			当前事件的起始位置(字节)
			210219 10:43:27		当前事件的起始日期和事件
			server id			当前事件所在的服务器ID
			end_log_pos		当前事件的结束位置(下一个事件的起始位置)
			Query			当前事件的类型
			thread_id=2		处理当前事件的服务器线程ID
			exec_time=0		当前语句时间戳与其写入二进制文件中的时间差 
			error_code=0		错误代码
			CREATE DATABASE bb	执行的命令语句

			常用选项:
				--start-position	指定起始位置
				--stop-position	指定结束位置

				[root@localhost mysql]# mysqlbinlog --start-position=324 mysql-bin.000002 

				--start-datetime	指定起始时间
				--stop-datetime 	指定结束时间 
				
				[root@localhost mysql]# mysqlbinlog --start-datetime="2021-02-19 10:44:01" mysql-bin.000002	

			数据恢复:
				[root@localhost mysql]# mysqlbinlog --start-position=245 --stop-position=324 mysql-bin.000002 | mysql

	5、中继日志 
			

	6、事务日志 


一、数据库日志
	1、中继日志
		作用:在主从复制的环境中,记录来自主服务器的事件

		relay_log			中继日志的文件名
		relay_log_index  		中继日志的索引文件的文件名及位置

		relay_log_info_file 		记录中继日志文件的相关信息
		relay_log_purge 		是否自动删除无用的中继日志文件
		relay_log_recovery 		是否允许对中继日志做自动回复相关的配置
		relay_log_space_limit 	中继日志可以使用的空闲空间大小,默认为0,表示不做限制

	2、事务日志
		作用:保障事务性存储引擎中的ACID功能特性的实现

		组成:
			重做日志:redo  log		事务日志中已正常提交,但未同步到持久化存储上时,记录在重做日志中
			回滚日志:undo log 	事务日志中未正常提交的事务,记录在回滚日志中。

		innodb_log_block_size 		XtraDB存储引擎设置重做日志文件的大小	
		innodb_log_buffer_size		设置重做日志可以使用磁盘缓冲区的大小,该值越大意味着可以运行更大的事务
		innodb_log_file_size 		InnoDB存储引擎中设置重做日志文件的大小
		innodb_log_files_in_group		InnoDB存储引擎中重做日志中的文件数据
		innodb_log_group_home_dir 		InnoDB存储引擎中重做日志的文件路径

二、数据库的备份和还原
	1、影响数据安全的因素
		硬件故障、软件故障、自然灾害、黑客攻击、误操作 
		
	2、数据恢复的指标
		RTO	恢复时间目标,允许业务系统停止服务的最长时间
		RPO	恢复点目标,允许业务系统的数据的丢失量 

	3、数据备份概述
		
		a、完整备份
			备份整个数据集(备份整个数据库)
		b、部分备份
			备份部分数据集(备份某一个数据表)

			增量备份
				备份自上一次备份以来(增量或完整),新产生的数据
				节约空间,还原相对麻烦
			差异备份
				备份自上一次完整备份依赖,新产生的数据 
				浪费空间,还原相对简单

	4、数据备份方式
		a、按服务器运行状态划分 
			热备份
				对数据库进行备份时,数据库的读写操作均不受影响
			冷备份
				对数据库进行备份时,数据库不能进行读写操作
			温备份
				对数据库进行备份时,数据库可读,但不可写 

			MyISAM:不支持热备,仅支持温备和冷备
			InnoDB:支持热备、温备、冷备

		b、按数据的不同处理方式划分
			物理备份
				通过cp、tar等命令直接打包复制数据库数据文件,从而达到数据备份的目的
			逻辑备份
				通过特定工具从数据库中导出数据并另存,从而达到数据备份的目的

	5、MariaDB备份的注意事项
		a、备份对象
			数据
			二进制日志、事务日志
			代码
			配置文件
		b、备份工具
			cp、tar等归档复制工具
				物理备份工具,使用所有的存储引擎
			mysqldump
				逻辑备份工具,使用所有的存储引擎
			mysqlhotcopy
				类似冷备,仅支持MyISAM引擎
			lvm快照
				类似热备,借助文件系统进行备份
			xtrabackup
				percona提供的热备工具


三、数据备份操作
	1、物理备份:cp、tar
			MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
	
			[root@localhost mysql]# cp -a /backup/* /var/lib/mysql/

	2、逻辑备份:mysqldump
		
			[root@localhost ~]# mysqldump --all-databases --lock-all-tables > 1.sql

			备份格式:
				mysqldump  数据库 [数据表] 			恢复时,需要手动创建数据库		 mysql cc < c.sql

				mysqldump  --database 数据库 		恢复时,不需要手动创建数据库		 mysql < c.sql
				mysqldump  --all-databases 			恢复时,不需要手动创建数据库		 mysql < c.sql
	
	3、LVM快照:
		
			[root@localhost ~]# lvcreate -L 1G -n mariadb-snap -p r -s /dev/vg0/lv0

四、数据库的多机配置
	1、主从配置 
		作用:单向数据同步(主-->从)

		主服务器:
			a、修改主配置文件
				log-bin=mysql-bin
				server-id=1			
			b、授权从服务器
				MariaDB [(none)]> GRANT replication slave ON *.* TO 'zhangsan'@'192.168.1.254' IDENTIFIED BY '123456';
			c、查看当前正在使用的二进制文件
				MariaDB [(none)]> SHOW MASTER STATUS;

		从服务器:
			a、修改主配置文件
				log-bin=mysql-bin
				server-id=2
			b、添加授权信息
				MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='zhangsan',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=403;
			c、启动从服务器线程
				MariaDB [(none)]> START SLAVE;
					检查下述选项:
				             	Slave_IO_Running: Yes
            					Slave_SQL_Running: Yes

一、多机配置
	1、主从配置

	2、一主多从 
		作用:实时的数据备份 

	3、多主一从
		作用:更具性价比的数据备份方案

		从服务器配置:
		
		a、修改主配置文件
		vim /etc/my.cnf	

		[mysqld_multi]
		mysqld=/usr/bin/mysqld_safe
		mysqladmin=/usr/bin/mysqladmin
		log=/tmp/multi.log

		[mysqld1]
		port=3306
		datadir=/var/lib/mysqla
		pid-file=/var/lib/mysqla/mysqld.pid
		socket=/var/lib/mysqla/mysql.sock
		server-id=22
		user=mysql

		[mysqld2]
		port=3307
		datadir=/var/lib/mysqlb
		pid-file=/var/lib/mysqlb/mysqld.pid
		socket=/var/lib/mysqlb/mysql.sock
		server-id=22
		user=mysql
	
		b、初始化数据库的数据目录
		[root@localhost ~]# mysql_install_db --datadir=/var/lib/mysqla --user=mysql
		[root@localhost ~]# mysql_install_db --datadir=/var/lib/mysqlb --user=mysql	

		[root@localhost ~]# chown -R mysql /var/lib/mysqla
		[root@localhost ~]# chown -R mysql /var/lib/mysqlb
			
		c、启用多进程
		[root@localhost ~]# mysqld_multi --defaults-file=/etc/my.cnf start 1
		[root@localhost ~]# mysqld_multi --defaults-file=/etc/my.cnf start 2

		d、登录不同进程,建立主从关系
		[root@localhost ~]# mysql -P 3306 -S /var/lib/mysqla/mysql.sock
			MariaDB [(none)]> CHANGE MASTER TO ...
		[root@localhost ~]# mysql -P 3307 -S /var/lib/mysqlb/mysql.sock
			MariaDB [(none)]> CHANGE MASTER TO ...

	4、主主配置
		
		log-bin=mysql-bin
		server-id=1
		replicate-do-db=test			#指定需要同步的数据库
		binlog-ignore-db=mysql			#指定不需要同步的数据库
		binlog-ignore-db=information_schema
		auto-increment-increment=2			#设定自增长参数的增长量
		auto-increment-offset=1			#设置自增长参数的起始值

二、读写分离
	1、amoeba
		作用:分布式数据库的前端代理层  
		
		功能:读写分离、负载均衡、高可用 

	2、amoeba优势:
		性价比:用普通服务器支撑较大的访问压力
		可用性:避免单台服务器故障造成的访问失效
		易于扩展:通过扩展新节点,在不影响现有业务系统的情况下,实现性能的提升

	3、配置
		
	





		
		


				
		
	
		



			
				
		
			

		
		




		

		

					
		
		
			

	

	
		
		
			
				



		
	
		

		




















			 
			








		
		


	

		







		 

	






				

你可能感兴趣的:(运维工程师,mysql,笔记,数据库)