加载中...

mysql数据库

MySQL Replication概述

	MySQL Replication俗称 MySQL AB复制、主从复制、主从同步,是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到数据同步效果。
	
优点:
	通过增加从服务器来提高数据库平台的可靠性。在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整数据库平台的高性能。
	提高数据安全性.因为数据已复制到从服务器,主数据库数据异常时,可以将从服务器复制进程终止来达到保护数据完整性的特点。
	在主服务器上生成实时数据.而在从服务器上分析这些数据,从而缓解主服务器的性能压力。

MySQL复制类型

异步复制
	MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理了事务,这样就会有一个问题,主库如果down 掉了,此时主上已经提交的事务可能并没有传到从库服务器上,如果此时,强行将从提升为主,可能会导致新主上的数据不完整。默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。

全同步复制
	指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响,返回客户端的响应速度也会被拖慢。

半同步复制
	MySQL5.5由 Google贡献的补丁才开始支持半同步复制模式,介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP 往返的时间。所以半同步复制最好在低延时的网络中使用。当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。


半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式。

半同步复制原理图:

image-20220929065459672

半同步复制的潜在问题:
	客户端事务在存储引擎层提交后,在得到从库同步的过程中,主库宕机了。此时可能的情况有两种:
事务还没发送到从库上
	此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当宕机的主库重新启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来的。
事务已经发送到从库上
	此时从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主年。

无数据丢失的半同步复制·
针对上述潜在问题,MySQL 5.7引入了一种新的半同步方案: Loss-Less半同步复制。针对上面这个图."Waiting Slave dump”被调整到"Storage Commit"之前。当然,之前的半同步方案同样支持,MySQL 5.7.2引入了一个新的参数进行控制rpl_semi_sync_master_wait_point。
v
rpl_semi_sync_master_wait_point有两种取值
AFTER_SYNC:这个即新的半同步方案,Waiting Slave dump 在 Storage Commit之前。
AFTER_COMMIT:老的半同步方案

MySQL支持的复制方式

	基于SQL 语句的复制(SBR):在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高。
	基于行的复制(RBR):主服务器把表的行变化作为事件写入到二进制日志中,主服务器代表了行变化的事务复制到从数据库中
	混合模式复制(MBR):先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行。

	在MySQL5.1.4之前的版本都只能使用基于SQL语句的复制方式,MySQL5.6.5和往后的版本是基于GTIDs来进行事务复制。当使用GTIDs时可以大大简化复制过程,因为GTIDs完全基于事务,只要在主服务器上提交了事务那么从服务器就一定会执行该事务。

通过设置服务器的系统变量binlog_format来指定要使用的格式:
RBR的优点:
	任何情况都可以被复制,这对复制数据来说是最安全可靠的更少的行级锁表
	和其他大多数数据库系统的复制技术一样
	多数情况下,从服务器上的表如果有主键的话,复制就会快很多
	
RBR的缺点
	Binlog文件较大
	复杂的回滚时 binlog中会包含大量的数据
	主服务器上执行多个 UPDATE语句时,所有发生变化的记录都会写到 binlog 中,而且只写为一个操作事物,这会导致频繁发生binlog的并发写问题
	不能通过查看日志来审计执行过的sql 语句,不过可以通过使用mysqlbinlog --base64-output=decode-rows --verbose来查看数据的变动

SBR的优点
	历史悠久,技术成熟;binlog文件较小
	binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
	binlog 可以用于实时的还原,而不仅仅用于复制
	主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR的缺点
	不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。
	复制需要进行全表扫描(WHERE 语句中没有使用到索引)的UPDATE 时,需要比 RBR请求更多的行级锁
	对于一些复杂的语句,在从服务器上的耗资源情况会更严重
	
	
	无论选择哪种方式复制,都会影响到复制的效率以及服务器的损耗,以及数据一致性问题,目前其实没有很好的客观手段去评估一个系统更适合哪种方式的复制。


复制工作原理

image-20221226075809237

记
	当master 上的数据发生改变时,则将其改变写入二进制曰志 binlog日志中;
	slave 服务器会在一定时间间隔内对master 二进制日志进行探测其是否发生改变.如果发生改变,从库会生成两个线程,一个I/O线程,一个SQL线程;Io线程会去请求主库的binlog.并将得到的 binlog 写到本地的relay-log(中继日志)文件中
	主库会生成一个 log dump 线程,用来给从库lO线程传 binlog
	SQL线程,会读取relay log文件中的日志.并解析成sql语句逐一执
	最后IOThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

部署mysql主从异步复制

准备两台虚拟机 主 从

#所有主机都执行
systemctl stop firewalld  
#停止防火墙
setenforce 0
#表示关闭selinux防火墙
iptables -F
#清除所有规则来暂时停止防火墙
ntpdate pool.ntp.org    
#同步网络时间
yum -y install mariadb mariadb-devel mariadb-server

#在master上执行
vim /etc/my.cnf
#编辑mysql主配置文件
[mysqld]
server-id=1  
#主(master)数据id为1

log-bin=mysql-binlog  
 #启动mysql二进制日志文件
 
log-slave-updates=true     
  #从(slave)同步二进制日志时进行更新
  
systemctl start mariadb    
#启动mariadb数据库

netstat -anptl|grep 3306  
#过滤mysql数据库端口

mysql    
#登录mysql,默认无需密码

grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
#说明:创建一个用户,并且对所有库和表有同步的权限,用户名为myslave,允许192.168.1.%网段的所有主机访问,数据库密码为123456

flush privileges; 
#刷新数据库

show master status;
#查看数据库状态
注:mysql-binlog.000003 (二进制日志文件名)  475(日志id) 2者来实现异步复制的

<<<##备份 Master原有数据
如果在生产环境中 Master服务器已经运行一段时间,或者Master服务器上已经存在数据,为了保证所有数据的一致性,需要先将 Master目前已有的数据全部导给 Slave 服务器。
备份的方法有很多,可以直接备份数据文件,也可以使用mysqldump 工具。全新搭建的环境不存在数据备份的问题。
mysqldump -u root --all-databases > /root/alldbbackup.sqle scp /root/alldbbackup.sql root@xx.XX.XX.x:/root/

slave上执行
mysql -u root -p < /rootalldbbackup.sql
#mysql slave导入数据
mysql -u myslave -p123456 -h 192.168.80.43
#从库连接主库进行测试,如果连接成功说明主库配置成功
>>>>

#slave(从)操作
[root@localhost ~]# mysql -u myslave -p123456 -h 192.168.1.128
\q
vim /etc/my.cnf  
[mysqld]
server-id=2      
relay-log=relay-log-bin  
relay-log-index=slave-relay-bin.index    

systemctl start mariadb     
#修改完后重启数据库

netstat -anptl|grep 3306 
#过滤数据库的端口

mysql
#进入数据库

stop slave; 
#停掉这个从

CHANGE MASTER TO
MASTER_HOST='192.168.1.128', 
MASTER_USER='myslave',   
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-binlog.000003',  
MASTER_LOG_POS=475;
#再slave服务器上授权,启动从库,进行主从同步数据

start slave;
#启动从

show slave status\G
#查看 这个从的状态

#《从库连接主库进行测试,如果连接成功说明主库配置成功
#mysql -u myslave -p 123456 -h 192.168.1.8
#vim /etc/my.cnf   #编辑mysql主配置文件
#[mysqld]
#server-id=2       #从(slave)数据id为2
#relay-log=relay-log-bin     #终/继日志
#relay-log-index=slave-relay-bin.index    #中继日志缩影

#systemctl start mariadb     #启动mariadb数据库
#netstat -anptl|grep 3306    #过滤mysql数据库端口
#mysql    #登录mysql从库
#stop slave;     #关闭同步
#CHANGE MASTER TO
#MASTER_HOST='192.168.1.8',     master ip
#MASTER_USER='myslave',     #用户名
#MASTER_PASSWORD='123456',    #密码
#MASTER_LOG_FILE='mysql-binlog.000003',    #日志名称
#MASTER_LOG_POS=475;   #日志id

#start slave;      #开启同步
#show slave status\G     #查看从(slave)状态》
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.128
                  #主服务器的ip地址
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-binlog.000003
              #主服务器二进制日志的文件名
          Read_Master_Log_Pos: 475
          #日志文件开始的位置
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 532
        Relay_Master_Log_File: mysql-binlog.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

测试复制是否成功

	在 Master 服务器上创建一个数据库或者表,到 Slave 服务器上查看,如果配置成功就可以成功同步。

#在主库/从库 查看数据库
show databases;

主(master)创建库和表
MariaDB [(none)]> create database zhaoxiaoshan;     #创建数据库库名为zhaoxiaoshan
MariaDB [(none)]> use zhaoxiaoshan;       #进入到创建的数据库中
MariaDB [sampdb]> create table new(name char(20),phone char(20));      #创建数据表

从(slave)验证
MariaDB [(none)]> show databases;    #查看数据库
MariaDB [(none)]> use zhaoxiaoshan       #切换数据库
MariaDB [sampdb]> show tables;     #查看数据表

报错解决方案

image-20221226094903646

image-20221226094957550

image-20221226095136212

数据不同步解决方法

从(slave)操作

MariaDB [(none)]> stop slave;     #关闭同步

MariaDB [(none)]> set global sql_slave_skip_counter=1;    #设置参数

MariaDB [(none)]> start slave;    #开启同步

部署mysql主从半同步复制 (基于上边实验(异步复制)基础上做)

#主(master)操作
#半同步复制支持多种插件
ls /usr/lib64/mysql/plugin/
#查看plugin目录下的mysql插件
rpm -ql mariadb-server|grep semisync  
#过滤半同步复制的插件
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
mysql
#登录主 mysql数据库
show plugins;  
#查看插件安装的插件

install plugin rpl_semi_sync_master soname   'semisync_master.so';
#在主节点安装并启动插件
MariaDB [(none)]> SHOW PLUGINS;

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
#查看插件允许状态 

MariaDB [(none)]> SET @@global.rpl_semi_sync_master_enabled=ON;
#启动插件

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';


从(slave)安装并启用插件:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#查看安装并启动插件
MariaDB [(none)]> SHOW PLUGINS;
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';  
#查看插件允许状态 
MariaDB [(none)]> SET @@global.rpl_semi_sync_slave_enabled=ON;  
#启动插件
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';


主(master)操作
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';   
#查看插件允许状态 

说明:在主节点上事先创建一个用户,并且对所有库和表有同步的权限,用户名为myslave,允许192.168.1.%网段的所有主机访问,数据库密码为123456

MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';

MariaDB [(none)]> flush privileges;  
#刷新数据库
MariaDB [(none)]> show master status;
#查看数据库状态



*从(slave)操作*
stop slave;    #关闭同步

CHANGE MASTER TO
MASTER_HOST='192.168.1.128', 
MASTER_USER='myslave',   
MASTER_PASSWORD='123456',  
MASTER_LOG_FILE='mysql-binlog.000003',   
MASTER_LOG_POS=921;  

CHANGE MASTER TO
MASTER_HOST='192.168.1.8',     #master ip
MASTER_USER='myslave',        #用户名
MASTER_PASSWORD='123456',       #密码
MASTER_LOG_FILE='mysql-binlog.000003',      #日志名称
MASTER_LOG_POS=903;    #日志id

start slave;      #开启同步

测试
*主(master)操作*
MariaDB [(none)]> CREATE DATABASE mydb CHARACTER SET 'utf8';
#创建数据库,库名为ymdb,数据库的编码格式为utf8

MariaDB [(none)]> show databases; 
#查看数据库

MariaDB [(none)]> use mydb;  
#切换数据库
MariaDB [mydb]> CREATE TABLE tbl1 (id INT,name VARCHAR(100));   
#创建数据库表,表名为tbl1

MariaDB [mydb]> SHOW GLOBAL STATUS LIKE '%semi%'; 
#查看master数据库允许状态

从(slave)操作
MariaDB [(none)]> show databases;  
#查看数据库是否复制成功



*主(master)操作*
mysql
use mydb
MariaDB [mydb]> INSERT INTO tbl1 VALUES (1,'tom');  
#在tbl1的表中插入数据,1,tom
MariaDB [mydb]> select * from tbl1;
#查询tbl1表中的所有数据



从(slave)操作
use mydb;
#切换数据库
MariaDB [mydb]> select * from tbl1;
#查看tbl1表中的所有数据是否复制成功

 SHOW GLOBAL STATUS LIKE '%semi%'; 

一主多从架构图

image-20221226151415406

主从从架构图

image-20221226151513566

image-20221226151620597

思考问题
一主多从和主从从的区别?
如果部署了主从还需要做数据备份吗? 
	需要,因为即便做了主从同步,但是也不能百分百保证数据不会丢失,所以最好做数据备份
	
备份可以在从服务器上完成,缓解主的压力吗?
	不能,因为可能会因为一网络的原因,从数据库没有同步主数据库的数据,这时候如果在从数据库进行备份会导致数据丢失。所以主库的数据才是最完整的,最好是主库进行备份
	
公司的数据库架构可以是主从同步嘛?
	可以,80-500人的公司用的数据库架构就是主从同步 ,五百-一万人的公司使用的架构:MHA
	
主从复制有延迟的缓解方法?
	出现的原因:从库所在机器的性能要比主库性能差
	从库的压力较大
	执行大事务
	在进行binlog日志传输的时候,如果网络带宽也不是很好
解决方案
	1、架构方面,分表分库,让不同的业务请求的不同的数据库中·
	2、服务的基础架构在业务和 mysql之间加入缓存层,减少mysql 的读的压力
	3、使用更好的硬件设备,比如高性能cpu,固态硬盘ssd等

#从库方面设置
4.sync_binlog(每次执行事务,都将事务写到磁盘中的方式0/1/N),sync_binlog=1 的时候,
表示每次提交事务都执行fsync,因为这样的话能够保证数据的安全性,但是如果出现主从复制的延迟问题,可以考虑将此值设置为100~1000中的某个数值
5、直接禁用salve 上的binlog,因为它会消耗磁盘io所以禁用
6、设置innodb_flush_log_at_trx_commit(每一次的事务提交是否需要把日志都写入磁盘)0(每次写到服务缓存,一秒钟刷写一次),1(每次事务提交都刷写一次磁盘),2(每次写到os 缓存,一秒钟刷写一次.建议用这个)

添加了缓存层的架构图

image-20221226154007743

sync_binlog=1

image-20221226154818901

基于Amoeba读写分离

介绍

	在实际生产环境中,如果对数据的读写都在一个数据库上操作,无论安全性,高可用还是高并发等各方面都不能满足实际需求,因此一般来说是通过主从复制的方式来同步数据,再通过读写分离来提升数据的高并发负载能力这样的方案进行部署
	
	简单来说读写分离就是在主服务器上写,只在从服务上读,基本的原理是让主数据库处理事务性查询,让从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库

image-20220930084022540

目前较为常见的读写分离方案有两种

1.基于程序代码内部实现
	在代码中根据select,inster 进行分离,这类方法在目前生产环境中应用最广泛,优点是性能好,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维无从下手
2.基于中间代理层实现
	代理一般位于客户端和服务器之间,代理服务器接待客户端请求后通过判断后转发到后端数据库,代表性程序
mysql-proxy
	mysql官方开发的早期开源项目,通过自带的lua脚本进行sql判断,虽然是mysql官方产品,但是 mysql官方不建议将其应用到生成环境

amoeba(变形虫)
	由曾就职于阿里巴巴的陈思儒开发,该程序由java语言进行开发,阿里巴巴将其应用于生成环境,不支持事务和存储过程

	通过程序代码实现 mysql读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的java应用,如果在程序代码中实现读写分离对代码改动就较大,像这种应用一般会考虑使用代理层来实现。

环境部署

image-20220930084845838


部署mysql 主从架构

#master
yum -y install mariadb mariadb-devel mariadb-server
#安装mariadb依赖和服务
vim /etc/my.cnf
#编辑主配置文件
server-id=1
#主服务id为1
log-bin=mysql-binlog
#启动mysql二进制日志文件
log-slave-updates=true
 #从(slave)同步二进制日志时进行更新
systemctl start mariadb
#启动mairadb数据库
netstat -anptl|grep :3306
#过滤3306端口
ps aux|grep mysql
mysql
#登录mysql
grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
#创建一个用户并且对所有库和表有同步权限,用户名myslave,允许192.168.1.%网段的所有主机访问,数据库密码为123456
flush privileges;
#刷新数据库状态
show master status;
#查看数据库状态
注:mysql-binlog.000003 (二进制日志文件名)  475(日志id) 2者来实现异步复制的


#slave1/slave2
yum -y install mariadb mariadb-devel mariadb-server
#安装数据依赖和服务
mysql -u myslave -p123456 -h 192.168.1.128    
#从库连接主库进行测试,如果连接成功说明主库配置成功
exit
#退出数据库
\q
#退出数据库
vim /etc/my.cnf 
#编辑从的主配置文件
[mysqld]
server-id=2
#从id为2,每个server服务的标识,在master/slave环境中,此变量一定要不一样
relay-log=relay-log-bin  
#中继日志文件的路径名称
relay-log-index=slave-relay-bin.index      
#中/继日志缩影,中继日志索引文件的路径名称
systemctl start mariadb
#启动mariadb数据库
netstat -anptl|grep 3306  
#过滤mysql数据库端口
mysql
#登录mysql从库
stop slave; 
#关闭同步

CHANGE MASTER TO
MASTER_HOST='192.168.1.128', 
MASTER_USER='myslave', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-binlog.000003', 
MASTER_LOG_POS=475; 



CHANGE MASTER TO
MASTER_HOST='192.168.1.8', 
#master ip
MASTER_USER='myslave', 
#用户名
MASTER_PASSWORD='123456', 
#密码
MASTER_LOG_FILE='mysql-binlog.000003',
#二进制日志文件名
MASTER_LOG_POS=476;   
#日志id

start slave;  
#开启同步
show slave status\G  
#查看从(slave)状态
#测试复制是否成功在 Master服务器上创建一个数据库或者表,到 Slave 服务器上查看,如果配置成功就可以成功同步

#主master
show databases;
#查看数据库
create database sampdb;  
#创建数据库,库名为sampdb
use sampdb;   
#切换到sampdb数据库中
create table new(name char(20),phone char(20));   
#创建库表,表名为new,参数为 naem  phone

#两个从
show databases; 
#查看数据库
use sampdb;
#切换数据库
show tables; 
#查看数据表

#主(master),从(slave1),从(slave2)操作*
grant all on *.* to 'amoeba'@'192.168.1.%' identified by '123.com';
#创建amoeba用户和密码
flush privileges;   
#刷新数据库

主Amoeba主机上安装java环境

rpm -e --nodeps `rpm -qa java*`
#删除原先shell环境中安装的jdk

rpm -qa java*    
#查看jdk

rz

chmod +x jdk-6u31-linux-x64-rpm.bin 
#对jdk加执行权限
./jdk-6u31-linux-x64-rpm.bin  
#安装jdk
vim /etc/profile.d/java.sh  
#编辑jdk启动脚本
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:/$PATH
. /etc/profile.d/java.sh 
#重读脚本配置文件

source /etc/profile.d/java.sh  
#再次重读脚本环境变量

java -version  
#查看jdk版本

安装配置Amoeba

mkdir -pv /usr/local/amoeba  
#创建amoeba存放目录
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba   
#将amoeba软件包解压到指定的amoeba存放目录中

ls /usr/local/amoeba/
#确认查看

chmod -R 755 /usr/local/amoeba  
#递归授amoeba 755权限

vim /usr/local/amoeba/conf/dbServers.xml  
#编辑amoeba主配置文件,连接数据库的主配置文件

#设置amoeba连接后端数据库服务器的账号,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接   26
 <!-- mysql user -->    
           <property name="user">amoeba</property>

#设置amoeba连接后端数据库服务器的密码  30
<!--  mysql password-->     
           <property name="password">123.com</property>

#设置一个后端可写的dbServer,这定义为master  这个名称可自定义,后面amoeba.xml文件会用到  45
<dbServer name="master"  parent="abstractServer">    
                <factoryConfig>

#设置后端可写dbserver的ip (master ip) 48
  <!-- mysql ip -->         
      <property name="ipAddress">192.168.1.8</property>
         </factoryConfig>

#设置后端可读 dbserver (如果是多个slave从节点,这就配置多个<dbServer> ...</dbServer>,然后加入到后面第1个可读的组内)

<dbServer name="slave1"  parent="abstractServer">        
                <factoryConfig>
                        <!-- mysql ip -->   
                        <property name="ipAddress">192.168.1.9</property>
                </factoryConfig>
        </dbServer>
 59     <dbServer name="server2"  parent="abstractServer">
 60                   <factoryConfig>
 61                          <!-- mysql ip -->
 62                           <property name="ipAddress">192.168.1.132</property>
 63                   </factoryConfig>
 64           </dbServer>

#设置定义一个虚拟的 dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到1个组,将这个组名字命名为slaves
 #66
 <dbServer name="slaves" virtual="true">       
                <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

#选择调度算法。1表示负载均衡,2表示权重,3表示HA,这里选择1
							<property name="loadbalance">1</property>
 71 							#设置可读数据名字
 72                         <!-- Separated by commas,such as: server1,server2,server1 -->
 73                         <property name="poolNames">slave1,slave2</property>
 74                 </poolConfig>
 75         </dbServer>


image-20220930120429958

vim /usr/local/amoeba/conf/amoeba.xml
#编辑amoeba.xml配置文件
#提供客户端连接 amoeba时需要使用这里设定的账号(这里的账号密码和amoeba连接后端数据库服务器的密码无关)    30
             <property name="user">amoeba</property>
             <property name="password">123456</property>
                                    
 #设置amoeba默认的池,这里设置为masterdb(这是在dbServers.xml)   115

  <property name="defaultPool">master</property>       

#指定前面定义好的写池    117

 <property name="writePool">master</property>

在dbServer.xml文件定义的读池          118

  <property name="readPool">slaves</property>

nohup /usr/local/amoeba/bin/amoeba start &    
#启动amoeba并放在后台(回车2次)

netstat  -antpl|grep 8066     
#过滤amoeba端口

netstat -anpt |grep :3306   
#过滤mysql端口  

在客户端进行测试

#客户端操作
yum -y install mairadb-devel mariadb       #安装mariadb数据库
mysql -uamoeba -p123456 -h192.168.1.13 -P8066     #通过代理访问mysql

mysql   
#登录客户端数据库

create database linux;  
#创建数据库
use linux;   
#切换数据库
create table student (id int(10),name varchar(10),address varchar(20));   
#创建数据表,表名为student,  参数为 id  name address

show tables;   
#查看数据表

*从(slave)1,从(slave)2上操作*
show databases;   
#查看数据库
use linux;  
#切换数据库
show tables; 
#查看数据表
stop slave;    
#关闭同步


sql语句分类

1.数据库定义语言(DDL)
	创建、修改或删除数据库中各种对象,包括表、视图、索引等。
命令: CREATE TABLE,CREATE VIEW, CREATE INDEX、ALTER TABLE, DROP TABLE ,DROP VIEW,DROP INDEX

2.数据库查询语言(DQL)
	按照指定的组合、条件表达式或排序检索已存在的数据库中数据不改变数据库中数据。
命令: SELECT…FROM…-WHERE… 

3.数据库操纵语言(DML)
	对已经存在的数据库进行插入、删除、修改等操作
	命令:INSERT、UPDATE、DELETE
	
4、数据库控制语言(DCL)
	用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视
	命令:GRANT、REVOKE、COMMIT、ROLLBACK

库的操作

#准备工作先下载数据库
yum -y install mariadb mariadb-server       #安装mariadb数据库

vim /etc/my.cnf
#编辑主配置文件
character-set-server=utf8
#字符集格式

systemctl start mariadb
#启动数据库

mysql
show variables like "%character%";
show variables like "%collation%";

#创建数据库中的库
create database test;
create database school;

#查看数据库中的库
show databases;

#切换数据库
use 库名
use school;

#显示当前操作的数据库
select database();

#删除库
drop database 库名;
例如:drop database school;

表操作

创建表:
格式:
create table 表名(
字段1 类型(长度) 约束条件],
字段2 类型(长度) 约束条件],
字段3 类型(长度) 约束条件]
);

例如:

MariaDB [test1]> create table student(
    -> id int,
    -> name varchar(50)
    -> );

create table student(
id int,
name varchar(50),
sex enum('man','female'),
age int(3)
);



#查表
show tables;
例如:MariaDB [test1]> desc student;


#修改表名
格式:alter table 表名 rename 新表名;
例如:MariaDB [test1]> alter table student rename sss;

#查看表结构
格式:desc 表名;
MariaDB [test1]> desc student;
方法2
格式: show create table 表名\G
例如: show create table sut\G       #表结构更详细 (推荐)

#插入单条数据
格式:insert into 表名 vaue (字段1,字段2,...);
MariaDB [test1]> insert into student value(1,'bob','man',18)
    -> ;
例如:insert into sut vaue (1,'admin',18);
注:数值类型(int)的数据可不加单引号

#*插入多条数据*
格式: insert into 表名 values (字段1,字段2,...),(字段1,字段2,...);
例如:insert into student values (2,'ls','female',21),(3,'aa','man',33);       #多条语句中间用","分割

#指定字段插入数据
格式:insert into student(字段1,字段2,...) values(字段1(值),字段2(值));
例如:insert into student(name,age) values ('hh',21);

#查看数据表所有数据
格式:select * from 表名;
例如:select * from student;
*指定字段查找数据表中的数据*
格式:select 字段1,字段2 from 表名;
例如:select name ,age from student;

#添加字段
格式:alter table 表名 add 字段名 类型;
例如: alter table student add addess varchar(50);


#*更新或修改表中的数据
格式:update 表名 set 字段名=修改后的值 where(条件) 基于哪个字段或数据进行修改
例如: update student set name='pwj',age=3 where id=1;


#*删除表中指定的数据记录
格式:delete from 表名 where(条件)  基于哪个字段或数据进行删除
如:delete from student where name='hh';


#删除表
drop table 表名;


#*解决mysql中文乱码*
前提:删除原先的数据库并退出mysql
vim /etc/my.cfg       #编辑mysql主配置文件
character-set-server=utf8     #mysql编码格式为utf8
systemctl restart mariadb     #重启mariadb

#*枚举类型*
enum 单选+只能选枚举范围内的,只能在给定的范围内选一个值
例如: create table student (name varchar(20),sex enum('man(男)','female(女)'));
insert into student value('lwx','man');

#*集合类型*
set 多选+去重+只能选择集合中的,在给定的范围内可选择一个或多个的值
例如: create table student (name varchar(20),hobby set('抽烟','喝酒','烫头'));
insert into student value('于谦','抽烟,喝酒,烫头');

数据类型

数值类型

日期类型和时间类型

字符串类型

枚举类型*
enum 单选+只能选枚举范围内的,只能在给定的范围内选一个值
例如: create table student (name varchar(20),sex enum('man(男)','female(女)'));
insert into student value('lwx','man');



*集合类型*
set 多选+去重+只能选择集合中的,在给定的范围内可选择一个或多个的值
例如: create table student (name varchar(20),hobby set('抽烟','喝酒','烫头'));
insert into student value('于谦','抽烟,喝酒,烫头');

vim /etc/my.cnf
character-set-server=utf8

#设置数据库的字符集
systemctl restart mariadb

单表查询

*数据准备*
`创建数据表,表名为t2,并设置参数`
create table student11 (
    id int not null unique auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male',
    age int(3) unsigned not null default 28,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int,
    depart_id int
) ENGINE = InnoDB DEFAULT CHARSET = utf8;  

#mysql编码格式utf8



*插入数据*`

insert into student11(name,sex,age,hire_date,post,salary,office,depart_id) values
('貂蝉','male',18,'20170301','宇宙驻地球办事处外交大使',7300.33,401,1), #以下是教学部,全都是老师
('蔡文姬','male',78,'20150302','teacher',1000000.31,401,1),
('安其拉','male',81,'20130305','teacher',8300,401,1),
('孙悟空','male',73,'20140701','teacher',3500,401,1),
('花木兰','male',28,'20121101','teacher',2100,401,1),
('周瑜','female',18,'20110211','teacher',9000,401,1),
('孙尚香','male',18,'19000301','teacher',30000,401,1),
('后羿','male',48,'20101111','teacher',10000,401,1),
('珊珊','female',48,'20150311','sale',3000.13,402,2),
#以下是销售部门
('彤彤','female',38,'20101101','sale',2000.35,402,2),
('莹莹','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('鸭鸭','female',28,'20170127','sale',4000.33,402,2),
('程咬钢','male',28,'20160311','operation',10000.13,403,3),
#以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);

查询语法

根据字段查询
格式: select 字段1,字段2 from 表名;
例如: select name, age  frorm t2;

查询字段数据并计算(加减乘除)
格式: select 字段1,字段2*12 from(条件) 表名;
例如: select name,salary*12 from t2;

给显示的字段重命名
格式:select 字段1,字段2*12 Annual_salary(给字段2重命名) from(条件) 表名;
例如: select name,salary*12 Annual_salary from t2;

concat: 字符拼接,并且显示拼接后的效果(使架构美观)
例如:select concat('姓名:',name,'|','年薪:',salary*12) Text from t2;
MariaDB [test1]> select concat('姓名:',name,'===','性别:',sex) 信息表 from student11;

单条件查询
说明:只查询post字段=sale的,并把姓名打印出来
例如: select name from t2 where post='sale';

多条件查询
说明:只查询post字段=teacher的并且salary(工资)>10000的把姓名和工资打印出来
例如: select name,salary from t2 where post='teacher' and salary>10000;

关键字 in 集合查询
说明:只查询满足in(集合中工资为3000,3500,4000,9000)的 把姓名和工资打印出来
例如: select name,salary from t2 where salary in (3000,3500,4000,9000);

关键字 like 模糊查询,模糊匹配,可结合通配符来使用*
通配符'%'   #匹配任意所有字符
例如: select * from t2 where name like '程%';   #查询所有姓名以程字开头后跟任意字符的行
例如: select id,name,age from t2 where id>7;    #查询t2表中的id 姓名 年龄 条件id>7的

聚合函数
count 统计个数的
例如:select count(*) from t2;    #统计t2表中所有数据条数
例如: select count(*) from t2 where depart_id=1;        #统计t2表中 depart_id=1数据个数
例如: select max(salary) from t2;    #查询t2表中salary字段中数据最大的
例如: select min(salary) from t2;    #查询t2表中salary字段中数据最小的
例如: select avg(salary) from t2;   #查询t2表中salary字段中数据的平均值

*limit:限制查询的记录数*
select * from t2 limit 2;   #显示t2表中的前2条数据
select * from t2 limit2,4;    #显示t2表中第2条数据的后4条数据

Navicat   mysql图形化工具
安装前提:
mysql    #登录mysql
grant all on *.* to 'root'@'192.168.1.%' IDENTIFIED BY '123456';
flush privileges;      #刷新数据库

数据备份

	随着自动化办公与电子商务的不断扩展,企业对于信息系统的依赖性越来越重要,而数据库在信息系统中担任着非常重要的角色。尤其一些对数据库可靠性要求非常高的行业,例如银行,证券,电信等,如果发生意外宕机或数据丢失,其损失是非常重要的。为此数据库管理员必须针对具体的业务要求定制详细的数据库备份与灾难恢复的策略,并通过模拟故障对每种可能的情况进行严格的测试。而保障数据的可靠性。
	
数据备份的重要性:
	备份的主要目的是灾难恢复,备份还可以测试应用,回滚数据修改,查询历史数据,审计等。我们将从生产运维的角度了解备份恢复的分类与方法。
	在企业中数据的价值至关重要,数据保障了企业业务的运行,因此数据的安全性及可靠性是运维的重中之重,任何数据的丢失都有可能会对企业产生严重的后果。
造成数据丢失原因如下:
	程序错误
	人为错误
	数据泄露
	运算失败
	磁盘故障
	灾难(如,火山、地震)

数据备份类型

从物理与逻辑的角度,备份可以分为:
物理备份
逻辑备份

<<物理备份>>
	对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份又可分为脱机备份(冷备份)和联机备份(热备份)。这种类型的备份适用于出现问题时需要快速恢复的大型重要数据库。
1.冷备份:是在关闭数据库的时候进行的
2.热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件
3.温备份:数据库锁定表格(不可写入但可读)的状态下进行的

<<逻辑备份>>
	对数据库逻辑组件(如表等数据库对象)的备份,表示为逻辑数据库结构和内容的信息。

<<从数据库的备份策略角度>>
备份可分为完全备份、差异备份和增量备份

<<完全备份>>
	每次对数据进行完整的备份.即对整个数据库的备份、数据库结构和文件结构的备份.保存的是备份完成时刻的数据库状态,是差异备份与增量备份的基础。
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复;占用大量的空间;备份与恢复时间长

<<差异备份>>
	备份那些自从上次完全备份之后被修改过的所有文件,备份的时间起点是从上次完整备份起,备份数据量会越来越大。恢复数据时,只需恢复上次的完全备份与最近的一次差异备份。

<<增量备份>>
	只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份起到最后一次增量备份依次恢复,如中间某次的备份数据损坏,将导致数据的丢失。

常见的备份方法

	MySQL 数据库的备份可以采用很多种方式,如直接打包数据库文件(物理冷备份),专用备份工具(mysqldump),二进制日志增量备份,第三方工具备份等。

1)物理备份
物理冷备份时需要在数据库处于关闭状态下,能够较好的保证数据库的完整性。物理冷备份以用于非核心业务,这类业务都允许中断,物理冷备份的特点就是速度快,恢复时也是最为简单的,通过直接打包数据库文件夹(/usr/local/mysq/data)来实现备份。

2)专用备份工具 mysqldump
mysqldump是客户端常用逻辑备份程序,能够产生一组被执行以再现原始数据库对象定义和表数据的SQL语句。它可以转储一个到多个MySQL 数据库,其进行备份或传输到远程SQL服务器。mysqldump 更为通用,因为它可以备份各种表。

3)通过启用二进制(binlog)日志进行增量备份
MySQL支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户提供复制。对执行备份点后进行的数据库更改所需的信息进行备份。如果进行增量备份(包含上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。

4)通过第三方工具备份
Percona XtraBackup 是一个免费的MySQL 热备份软件.支持在线备份Innodb 和XtraDB,也可以支持MySQL表备份,不过MylSAM表的备份要在表锁的情况进行。

数据准备

yum -y install mariadb mariadb-server
#安装mariadb

systemctl start mariadb
#启动数据库

mysqladmin -uroot -p password 123456 
#设置mysql密码,为123456,完成过后直接回车

mysql -uroot -p123456
#登录mysql

MariaDB [(none)]> create database  abc;
#创建abc库

MariaDB [(none)]> show databases;
#查看库

MariaDB [(none)]> use abc
#切换到abc库

#数据准备
create table aa (
    id int not null unique auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male',
    age int(3) unsigned not null default 28,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int,
    depart_id int
) ENGINE = InnoDB DEFAULT CHARSET = utf8;


insert into aa(name,sex,age,hire_date,post,salary,office,depart_id) values
('貂蝉','male',18,'20170301','宇宙驻地球办事处外交大使',7300.33,401,1), #以下是教学部,全都是老师
('蔡文姬','male',78,'20150302','teacher',1000000.31,401,1),
('安其拉','male',81,'20130305','teacher',8300,401,1),
('孙悟空','male',73,'20140701','teacher',3500,401,1),
('花木兰','male',28,'20121101','teacher',2100,401,1),
('周瑜','female',18,'20110211','teacher',9000,401,1),
('孙尚香','male',18,'19000301','teacher',30000,401,1),
('后羿','male',48,'20101111','teacher',10000,401,1),

('珊珊','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('彤彤','female',38,'20101101','sale',2000.35,402,2),
('莹莹','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('鸭鸭','female',28,'20170127','sale',4000.33,402,2),

('程咬钢','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);

MariaDB [abc]> show tables;
#查看表

MariaDB [abc]> select * from aa;
#查看表内容

\q
#退出mysql

完全备份

MySQL 数据库的完全备份可以采用多种方式,物理冷备份一般用tar命令直接打包数据库文件夹(数据目录),而在备份前需要先停库。

1、直接打包数据库文件夹,源码安装位置 (/usr/local/mysql/data/)    rpm安装位置(/var/lib/mysql/)

冷备份完全备份
[root@localhost ~]# systemctl stop mariadb
#停止数据库

netstat -anptl|grep 3306   
#过滤3306端口


ls /var/lib/mysql/ 
#查看存放数据库的目录

[root@localhost ~]# ls /var/lib/mysql/abc/


mkdir /backup     
#创建备份目录

tar jcf /backup/mysql_all-`date +%F`.tar.gz /var/lib/mysql/     
#

ls /backup   
#查看备份目录

systemctl start mariadb  
#启动mysql

mysql -uroot -p123456
#登录mysql

MariaDB [(none)]> drop database abc;
#删除abc数据库


\q

systemctl stop mariadb
#停止数据库
 
rm -rf /var/lib/mysql/*
#删除mysql下的所有内容



cd /backup/
#切换到备份目录

ls

tar xf mysql_all-2022-10-03.tar.gz 
#解压

ls var/lib/mysql
#查看备份mysql 目录下的内容

mv var/lib/mysql/* /var/lib/mysql/
#将备份内容移动到原mysql目录下

systemctl start mariadb
#再启动mysql

mysql -uroot -p123456
#登陆数据库

show databases;
#查看库

use abc
切换到abc

show tables;
#查看表


(1)对单个库进行完全备份
[root@localhost backup]# mysqldump -uroot -p123456 --databases abc > /backup/abc-$(date +%Y%m%d).sql

注:备份的数据库必须在mysql中存在,不存在则报错

前提:  rm -rf /backup/var  
#将备份目录下的var目录删掉

格式:mysqldump -u用户名 -p密码 --databases 数据库名称 > /备份路径/备份文件名
例如: mysqldump -uroot -p123456 --databases abc> /backup/abc-$(date +%Y%m%d).sql(别名)

[root@localhost backup]# cat abc-20221003.sql 
#查看备份文件中的数据

(2)对多个库进行完全备份
格式: mysqldump -u用户名 -p密码 --databases 库名1 库名2 ... > /备份路径/备份文件名

例如:mysqldump -uroot -p123456 --databases mysql abc > /backup/mysql+abc-$(date +%Y%m%d).sql(别名)

[root@localhost backup]# cat  mysql+abc-20221003.sql
#查看备份文件中的数据

(3)对所有库进行完全备份
格式:mysqldump -u用户名 -p密码 --opt --all-databases > /备份路径/备份文件名,--opt:加快备份速度适用于大量数据备份

例如:mysqldump -uroot -p123456 --opt --all-databases > /backup/mysql_all.$(date +%Y%m%d).sql(别名)

cat /backup/mysql_all.20220913.sql   
#查看备份文件中的数据

(4)对表进行完全备份
格式: mysqldump -u用户名 -p密码 数据库名称 表名 > /备份路径/备份文件名

例如: mysqldump -uroot -p123456 abc aa  > /backup/LWX_lwx-`date +%Y%m%d`.sql(别名)

cat /backup/LWX_lwx-20220913.sql    
#查看表备份文件中的数据

使用mysqldump备份后,恢复数据

source(对单个库进行数据恢复)
mysql -uroot -p123456 
#密码登录mysql

drop database abc;
#对abc数据库进行删除

show databases; 
#查看数据库

MariaDB [abc]> source /backup/abc-20221003.sql
#执行备份sql脚本

show databases;
#再次查看数据库


#mysql命令
格式:mysql -u用户名 -p密码 < 库备份脚本的路径
格式:mysql -u用户名 -p密码 库名 < 表备份脚本的路径

[root@localhost ~]# mysql -uroot -p123456 -e 'show databases;'
#在命令行执行,可不进入mysql查看数据库

[root@localhost backup]# mysql -uroot -p123456 -e 'select * from  abc.aa;'
#

[root@localhost ~]# mysql -uroot -p123456 -e 'drop database abc;'
#在命令行执行,可不进入mysql删除数据库

[root@localhost ~]# mysql -uroot -p123456 < /backup/abc-20221003.sql
#恢复LWX数据库

mysql -uroot -p123456 -e 'show datbases;'  
#在命令行执行,可不进入mysql查看数据库

mysql -uroot -p123456 -e 'drop table abc.aa;'    
#删除LWX数据库中的lwx数据表

mysql -uroot -p123456 abc < /backup/abc_aa-20220913.sql 
#恢复LWX数据库中的lwx数据表

mysql -uroot -p123456 -e 'select * from abc.aa;' 
#查看abc数据库中aa表中的所有数据

利用mysqldump对MySql备份思路

1、定期实施备份,制定备份计划或策略,并严格遵守。
2、除了进行完全备份,开启MySQL服务器的 binlog日志功能是很重要的(完全备份加上日志,可以对MySQL进行最大化还原)。
3.使用统一和易理解的备份名称,推荐使用库名或者表名加上时间的命名规则,如abc_t2-20220811.sql,不要使用backup1或者abc之类没有意义的名字。

定期备份数据:
which mysqldump   
#查看mysqldump的绝对路径

mkdir /shell  
#在/下创建脚本目录

vim /shell/bak_mysql_all.sh 
#在脚本目录中编辑一个shell脚本,名字自定义,路径自定义,脚本作用是给数据备份
#!/bin/bash
/usr/bin/mysqldump -uroot -p123456 --opt --all-databases > /backup/mysql_all_info-`date +%Y%m%d`.sql   
#/usr/bin/mysqldump -uroot(用户名) -p123456(密码) --opt(快速备份) --all-databases(mysql所有库) > /backup/mysql_all_info-`date +%Y%m%d`.sql   
#备份数据中的所有库,备份到backup(备份目录)命名为mysql_all_info-`date +%Y%m%d`.sql

chmod +x /shell/bak_mysql_all.sh   
#给数据库备份脚本加执行权限

crontab -e
#进入计划任务界面,在设置计划任务时命令必须是绝对路径的方式使用

18 38 * * * /shell/bak_mysql_all.sh  
30 0 * * * /shell/bak_mysql_all.sh    
#每天的晚上0:30进行数据库备份脚本

数据库远程备份案例
对mysql-server的 abc库实现异地备份,每天凌晨2:00进行备份.撰写一个数据恢复脚本
注:需2台虚拟机

#主服务器
MySQL服务端授权,给予select和 lock tables权限,以备份

mysql -uroot -p123456  
#密码登录mysql

说明:设置一个用户对LWX数据库下的所有表有查询权限,用户名为"admin"只允许192.168.1网段的主机访问,用户密码为123.com

grant select,lock tables on abc.* to 'admin'@'192.168.1.%' identified by '123.com';
#

flush privileges;  
#刷新数据库

备份虚拟机
yum -y install mysql  
#安装mysql

mysql -uadmin -p -h192.168.1.9   
#连接测试

mkdir /shell   
#创建脚本目录

vim /shell/bakmysql.sh  
#编辑数据库备份脚本

#!/bin/bash
#设置登录变量
MY_USER="admin"   
#用户名
MY_PASS="123.com" 
#密码
MY_HOST="192.168.1.9"  
#主mysql ip
MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST" 
#连接数据库的命令格式,-uadmin -p123.com -h192.168.1.9

MY_DB1="LWX" 
#设置备份数据库

BF_DIR="/backup"   
#备份目录
BF_CMD="/usr/bin/mysqldump"   
#备份工具
BF_TIME=$(date +%Y%m%d-%H%M)
#时间(年、月、日-小时、分钟)
NAME_1="$MY_DB1-$BF_TIME"
#备份文件名


[ -d $BF_DIR ] || mkdir -p $BF_DIR   
#测试是否有备份目录,无则创建
cd $BF_DIR   
#进入备份目录
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
#/usr/bin/mysqldump -uadmin -p123.com -h192.168.1.9 --datatases LWX > LWX-20220913-1102.sql
#--remove-files表示删除源文件,并将执行结果放到/dev/null中
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove-files &>/dev/null



chmod +x /shell/bakmysql.sh   
#给备份数据库脚本加执行权限

crontab -e   
#进入设置计划任务界面

30 0 * * * /shell/bakmysql.sh  
#每天的0:30执行数据库远程备份脚本

增量备份与恢复

MySQL增量备份概念
	使用mysqldump进行完全备份.备份的数据中有重复数据,备份时间与恢复时间过长。而增量备份就是备份自上一次备份之后增加或改变的文件或内容。

增量备份的特点:
没有重复数据,备份量不大,时间短
恢复麻烦:需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。
	MySQL没有提供直接的增量备份办法.可以通过MySQL提供的二进制日志(binarylogs)间接实现增量备份。

MySQL二进制日志对备份的意义:
二进制日志保存了所有更新数据的数据库操作(SQL语句)。
二进制日志在启动 MySQL 服务器后开始记录.并在文件达到max_binlog_size 所设置的大小或者接收到flush-logs命令后重新创建新的日志文件。

[root@localhost ~]# vim /etc/my.cnf
52 max_binlog_size = 10240001二进制日志最大1M
	只需定时执行flush-logs方法重新创建新的日志,生成二进制文件序列;并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
	要进行 MySQL的增量备份,首先要开启二进制日志功能,开启MySQL的二进制日志功能。

方法一:MySQL的配置文件的[mysqld]项中加入 log-bin=文件存放路径/文件前缀,如log-bin=mysql-bin,然后重启mysqld 服务。默认此配置存在。
vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin

方法二:使用mysqld --log-bin=文件存放路径/文件前缀重新启动mysqld服务每周选择服务器负载较轻的时间段,或者用户访问较少的时间段进行备份。


***mysql增量备份***

前提:要进行mysql增量备份,首先要开启二进制日志功能,开启mysql的二进制日志功能

*开启二进制日志文件*

方法1:(推荐)

vim /etc/my.cnf   
#编辑mysql主配置文件

[mysqld]

server-id=1

log-bin=mysql-bin    
#log-bin=文件存放路径/文件前缀

systemctl start mariadb  
#启动mariadb

方法2:

使用mysqld --log-bin=文件存放路径/文件前缀,重新启动mysql服务,每周选择服务负载较轻的时间段,或者用户访问较少的时间段进行备份

Mysql增量恢复

应用场景
1.人为的执行SQL语句破坏了数据库的数据
2.在进行下一次全备之前发生系统故障导致数据库数据丢失
3.在主从同步架构中,主库数据发生了故障,保证从库数据一致性

增量恢复的方法
*一般恢复:备份的二进制日志内容全部恢复*
格式:mysqlbinlog [--no-defaults] 增量备份文件|mysql -u用户名 -p密码

*基于时间点的恢复:便于跳过某个发生错误的时间点实现数据恢复*
注:从日志开头截止到某个时间点的恢复

格式:mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 时:分:秒' 二进制日志|mysql -u用户名 -p密码

mysqlbinlog --no-defaults /backup/mysql-bin.000002|mysql -uroot -p123456  
#将数据备份目录中增量备份二进制文件恢复到mysql中

mysql -uroot -p123456 -e 'select * from abc.t2;' 
#查看abc数据库中的t2表增量数据

*从某个时间点到日志结尾的恢复*
格式:mysqlbinlog [--no-defaults] --start-datetime='年-月-日 时:分:秒' 二进制日志|mysql -u用户名 -p密码

*从某个时间点到某个时间点的恢复*
格式:mysqlbinlog [--no-defaults] --start-datetime='年-月-日 时:分:秒' --stop-datetime='年-月-日 时:分:秒' 二进制文件|mysql -u用户名 -p密码

*基于位置恢复:可能在同一时间点既有错误操作也有正确操作,位置恢复更加准确*
格式:mysqlbinlog --stop-position='操作id' 二进制日志|mysql -u用户名 -p密码      #从*ip结束

格式:mysqlbinlog --start-position='操作id' 二进制日志|mysql -u用户名 -p密码      #从*ip开始

制定企业备份策略的思路
1.确定当前mysql是处于哪种表类型下工作的,它们支持事物处理还是非事物的,因为我们需要根据不同的特点来做一些设置。
2要选择备份的形式是完全备份还是增量备份,它们各有优缺点。
3.为了保证恢复的完整性,我们得开启 binary log 功能,同时 binlog 给恢复工作也带
来了很大的灵活性,可以基于时间点或是位置进行恢复。考虑到数据库性能,我们可以将binlog文件保存到其他安全的硬盘中。
4.备份操作和应用服务同时运行,这样就十分消耗系统资源了,会导致数据库服务性能下降,这就要求我们选择一个合适的时间(比如在应用负担很小的时候)再来进行备份操作。
5.不是备份完就可以了,我们还得确认备份是否可用,所以之后的恢复测试是完全有必要的。

   根据数据更新频繁,则应该较为频繁的备份
   数据重要,则在有适当更新时进行备份
   在数据库压力小的时段进行备份,如一周一次完全备份,然后每天进行增量备份(中小公司,全备一般可一天一次心
   大公司可每周进行一次全备,每天进行一次增量备份
   尽量为企业实现主从复制架构

MySQL企业备份案例

需求描述:
	用户信息数据库为abc
	用户信息数据表为t2
	请为该公司每周进行完全备份
	每天为该公司进行增量备份
[root@localhost ~]# yum -y install mariadb mariadb-server
systemctl start mariadb
mysql
create database abc
#数据准备
show databases;
use abc;
请上滑找的数据准备
MariaDB [(none)]> create database abc;
MariaDB [(none)]> show databases;
MariaDB [(none)]> use abc
MariaDB [abc]> show tables;
MariaDB [abc]>  select * from aa;
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mariadb
#先进行一次完全备份
[root@localhost backup]#  mysqldump abc aa  > /backup/abc_aa-`date +%Y%m%d`.sql
#对表进行完全备份
[root@localhost backup]# mysqldump --databases abc > /backup/abc-`date +%F`.sql
#对abc数据库进行备份
[root@localhost backup]# mysql flush-logs
mysql
use abc
MariaDB [abc]> insert into aa (name,sex,age,hire_date,post,salary,office,depart_id) values ('静静','male',21,'20010910','cto',100000,003,0);    
MariaDB [abc]> select * from aa;

insert into aa (name,sex,age,hire_date,post,salary,office,depart_id) values ('赵小山','male',20,'20010910','cto',100000,004,0);  

进行增量备份

ls /var/lib/mysql    
#查看mysql二进制文件

[root@localhost backup]# cp -a /var/lib/mysql/mysql-bin.000003 /backup/
#将mysql目录下的二进制文件拷贝到backup(备份目录)

mysqlbinlog -v /backup/mysql-bin.000003  
#在备份目录中确认,查看日志文件

#模拟误操作
[root@localhost backup]# mysql -e 'drop table abc.aa;' 
#删除abc数据库中的aa表
[root@localhost backup]# mysql -e 'select * from abc.aa;' 
#查看这个表没有证明删除成功
[root@localhost backup]# mysql
#登录

MariaDB [(none)]> show databases;
#查看库

MariaDB [(none)]> use abc
#切库

MariaDB [abc]> show tables;
#查表

#恢复完全备份
[root@localhost backup]# mysql abc < /backup/abc_aa-20221005.sql
#恢复第一次备份的表

[root@localhost backup]# mysql -e 'select * from abc.aa;' 
#查看一下第一次备份的恢复成功

#恢复增量备份
[root@localhost backup]# mysqlbinlog --no-defaults /backup/mysql-bin.000003|mysql 
#将数据备份目录中增量备份二进制文件恢复到mysql中

[root@localhost backup]# mysql -e 'select * from abc.aa;' 
#在看一下,全部恢复成功

基于时间点的增量备份恢复

注:恢复abc数据库中原18条数据
[root@localhost backup]# mysql -e 'drop table abc.aa;' 
#删除

[root@localhost backup]# mysql abc < /backup/abc_aa-20221005.sql
#恢复全备

[root@localhost backup]# mysql -e 'select * from abc.aa;' 
#查看恢复成功

mysqlbinlog --no-defaults /backup/mysql-bin.000003
#查看二进制文件

# at 622
#221005  8:44:26 server id 1  end_log_pos 650   Intvar
SET INSERT_ID=20/*!*/;
# at 650
#221005  8:44:26 server id 1  end_log_pos 841   Query   thread_id=8     exec_time=0     error_code=0
SET TIMESTAMP=1664930666/*!*/;
insert into aa (name,sex,age,hire_date,post,salary,office,depart_id) values ('赵小山','male',20,'20010910','cto',100000,004,0)
/*!*/;
# at 841
#221005  8:44:26 server id 1  end_log_pos 868   Xid = 62


mysqlbinlog --no-defaults --stop-datetime='2022-10-05 8:44:26' /backup/mysql-bin.000003|mysql 
#仅恢复到 221005  8:44:26之前的数据,不恢复"赵小山"的信息,静静的信息恢复了,从二进制的开始时间开始,到 221005  8:44:26结束


mysql 6 -e 'drop table abc.aa;'
#删除abc数据库中aa表

mysql -e 'select * from abc.aa;'  
#查看abc数据库中aa表

mysql abc < /backup/abc_aa-20221005.sql 
#将备份目录中abc数据库中的aa表恢复到mysql

mysql  -e 'select * from abc.aa;'    
#查看abc数据库中的aa表


mysqlbinlog --no-defaults --start-datetime='2022-10-05 8:44:26' /backup/mysql-bin.000003|mysql
#跳过“静静”的信息  恢复赵小山的信息,从2022-10-05 8:44:26这个时间开始恢复,恢复到结尾

mysql  -e 'select * from abc.aa;' 
#查看aa表


基于位置恢复

mysql 6 -e 'drop table abc.aa;'
#删除abc数据库中aa表

mysql -e 'select * from abc.aa;' 
#查看abc数据库中aa表

mysql abc < /backup/abc_aa-20221005.sql
#恢复全备

mysql -e 'select * from abc.aa;' 
#查看abc数据库中aa表

mysqlbinlog --no-defaults /backup/mysql-bin.000003
#查看二进制日志文件

[root@localhost backup]# mysqlbinlog --no-defaults --start-position='650' /backup/mysql-bin.000003|mysql 
#基于位置恢复赵小山


image-20221005101518133

数据库索引

	在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所有数据。数据库的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单。

索引的作用

(1)设置了合适的索引之后,数据库利用各种快速的定位技术,能够加快查询速率,特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍。
(2)可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
(3)通过创建唯一性索引保证数据表数据的唯一性,可以加快表与表之间的连接。
(4)在使用分组和排序时,可大大减少分组和排序时间。

索引的分类

(1)普通索引
这是最基本的索引类型,而且没有唯一性之类的限制
(2)唯一性索引
与普通索引基本相同,区别在于:索引列的所有值都只能出现一次,即必须唯一,但可为空。
(3)主键
是一种特殊的唯一索引,必须指定为"PRIMARY KEY",具有唯一性的同时不能为空。
(4)全文索引
在MySQL中,全文索引的类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建。贴吧的文本内容,和一些小型的网站网页内容,存放在数据库中即为全文索引模式。她
(5)单列索引与多列索引
索引可以是单列上创建的索引,也可以是多列上创建的索引。

创建索引的原则依据

1、表的主键、外键必须有索引2、数量超过300行的表应该有索引
3、经常与其他表进行连接的表,在连接字段上应该建立索引4、唯一性太差的字段不适合建立索引
5、更新太频繁的字段不适合创建索引
6、经常出现在where字句中的字段,特别是大表的字段,应该建立索引7、索引应该建在选择性高的字段上
8、索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引

创建、查看、删除索引的方法

根据企业需求选择了合适的索引之后,可以使用 CREATE INDEX创建索引,CREATEINDEX加上各个索引关键字便可创建各个类型的索引。

[root@localhost ~]# yum -y install mariadb mariadb-server
#下载mariadb

vim /etc/my.cnf
[client]
default-character-set=utf8
#指定 字符集

systemctl start mariadb 
#启动mariadb

ps aux|grep mysql 
#查看mysql进程

mysql

[root@localhost ~]# mysqladmin -uroot -p password 123456
#设置mysql密码,为123456,完成过后直接回车

mysql -uroot -p123456       
#输入密码登录mysql

create database imployee_salary default charset utf8;   
#创建一个数据库,库名为 imployee_salary,库的编码格式为utf8

use imployee_salary;  
#切换imployee_salary中

*数据准备*

#建立数据表IT_salary
#/int数字类型、char 字符串类型、not null 不能为空、char() 指定最多字节个数、primary key() 指定索引字段
create table IT_salary(岗位类别 char(20) not null,姓名 char(20) not null, 年龄 int, 员工ID int not null,学历 char(6),年限 int,薪资 int not null, primary key(员工ID));

desc IT_salary;    #查看数据表结构


#将IT部的员工工资信息插入到IT_salary
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('网络工程师','天线宝宝',27,011,'本科',3,4800);
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Windows工程师','孙空武',19,012,'中专',2,3500);
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Linux工程师','白幽灵',32,013,'本科',8,25000);
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Java软件工程师','灭霸',38,014,'大专',10,16000);
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('硬件驱动工程师','蔡文姬',29,015,'大专',9,16500);
insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('PHP工程师','石原里美',44,016,'高中',20,34950);

show tables;  
#查看数据表

select * from IT_salary;
#查看 IT_salary表中的所有数据


索引操作

<查看索引>

方法1:格式: show index from 表名;
例如:show index from IT_salary;

方法2:格式: show keys from 表名;
例如:show keys from IT_salary;

方法3:格式:show index from 表名 \G; 
例如:show index from IT_salary \G;    
#展示效果更详细

<<创建普通索引>>
格式: create index <索引名> on 表名(字段名);
例如:create index salary_index on IT_salary(薪资);

show index from IT_salary;
#查看索引



<<创建唯一索引>>
格式:create unique index <索引名> on 表名(字段);
例如:create unique index salary_unique_index on IT_salary(姓名);

show index from IT_salary \G;   
#查看索引,展示效果更详细



<<创建主键索引>>
注:一张数据表中只能有一个主键
格式:
CREATE TABLE 表名([…],PRIMARY KEY(字段));
例如:create table IT_salary(岗位类别 char(20) not null,姓名 char(30) not null,年龄int(3),员工ID int not null,学历 char(6),年限int(3),薪资 char(10) not null,primary key(员工ID));

#若在新建表时忘记创建主键,可以进行如下操作:
格式:ALTER TABLE 表名 ADD PRIMARY KEY(字段);
例如:alter table IT_salary add primary key(员工ID);

#删除索引
格式:
方法1:drop index <索引名> on 表名; 
#删除表中索引

例如:drop index salary_index on IT_salary;

方法2:alter table 表名 drop index <索引名>; 
#删除唯一索引

例如:alter table IT_salary drop index salary_unique_index;

方法3:alter table 表名 drop primary key; 
#删除主键索引

例如:alter table IT_salary drop primary key;

show keys from IT_salary;      
#查看索引

数据库事物的概念

	事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么不都执行。
	事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
	事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。通过事务的完整性以保证数据的一致性。
	
<<<记  事务的ACID特点
事务具有四个属性: ACID
原子性
一致性
隔离性
持久性>>>

1、原子性
	事务是一个完整的操作,事务的各元素是不可分的(原子的),事务的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。

2、一致性
	当事务完成时,数据必须处于一致状态:在事务开始之前,数据库汇总存储的数据处于一致状态;在正在进行的事务中,数据可能处于不一致的状态;当事务完成时,数据必须再次回到已知的一致状态。

3、隔离性
	对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应该以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
	
4、持久性
事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的。一旦事务被提交,事务的效果会被永久地保留在数据库中。

事务的操作

	默认情况下MySQL 的事务是自动提交的,当sql语句提交时事务便自动提交。

手动对事务进行控制的方法:
	事务处理命令控制
	使用set设置事务处理方式

事务处理命令控制事务:
	begin	开始一个事务
	commit 	提交一个事务
	rollback回滚一个事务(撤销)

MySQL事务的操作必须基于	Innodb 存储引擎

commit事例

commit事例
[root@localhost ~]# yum -y install mariadb mariadb-devel mariadb-server
systemctl start mariadb
mysql
create database auth default charset utf8;   
#创建数据库,库名为auth,数据库的编码格式为utf8

use auth;      
#切换到auth库中

create table users(user_name char(18) not null,user_passwd char(50) default '', primary key (user_name)) engine=innodb;       
#创建数据表,表名为users,并将user_name的字段设置为主键,数据库引擎为innodb

desc users; 
#查看users表中的数据结构

#事务开始
begin; 
#开始一个事务

insert into users values('中中中',password('000000'));     
#在users表插入一条数据

insert into users values('阿斯蒂芬',password('666666')); 
#在users表再插入一条数据
#事务结束并提交
commit;  
#提交事务

select * from users;    
#查看users表中所有数据

rollback事例

use auth;  
#切换auth数据库

事务开始
begin;  
#开始事务

update users set user_passwd=password('') where user_name='asdf';  
#将users表基于姓名为“asdf”的用户将他的密码修改为空
rollback;         
#回滚(撤销操作),从begin开始的所有命令都将被撤销

select * from users;
#查看users表中的所有数据

使用set命令进行控制

set autocommit=0;	
#禁止自动提交
set autocommit=1;	
#开启自动提交

事例:
set autocommit = 0;  
#禁止自动提交

use auth;  
#切换auth数据库

insert into users values('aaa',password('333333'));
insert into users values('vvv',password('111111'));

commit; 
#提交前面两条SQL语句,为一个事务

select * from users;   
#查看users表中的所有数据


#开启自动提交
set autocommit = 1;

use auth;    
#切换auth数剧库

#第一个事务
insert into users values('刘小四',password('123456'));

#第二个事务
insert into users values('张三',password('637900'));

select * from users;   
#查看users表中的所有数据

存储引擎概念

	MySQL 数据库中使用各种不同的技术存储数据到文件系统中,每一种技术都使用不同的存储机制、索引技巧,锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。
	存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式
	目前MySQL常用的两种存储引擎: MyISAM、InnoDB
	MySQL存储引擎是 MySQL 数据库服务器中的组件,负责为数据库执行实际的数据I/O操作,使用特殊存储引擎的主要优点之一在于仅需提供特殊应用所需的特性,数据库中的系统开销较小,具有更有效和更高的数据库性能。
	MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行文件的物理存储。

image-20221003092049734

MySQL日志种类:
错误日志:程序运行,启动类的故障
二进制日志:保存数据库变更语句
中继日志:缓存二进制日志数据
查询日志:记录查询语句的(通用日志)
慢查询日志:记录超时的查询语句(调优)

MyISAM概述

	MylISAM存储引擎是 MySQL关系数据库系统5.5版本之前默认的存储引擎,前身是ISAM。
	ISAM是一个定义明确且经历时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数。
	ISAM 的特点:ISAM执行读取操作的速度很快,而且占用不大量的内存和存储资源,它不支持事务处理,数据不能够容错。	
	MylSAM 管理非事务表,是ISAM的扩展格式,提供 ISAM里所没有的索引和字段管理的大量功能。
	MylSAM使用一种表格锁定的机制,以优化多个并发的读写操作。MylSAM提供高速存储和检索,以及全文搜索能力

MylSAM的特点
<<<< 记 (1)不支持事务。
(2)表级锁定形式,数据在更新时锁定整个表。
(3)数据库在读写过程中相互阻塞(会在数据写入的过程中阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入)。
(4)可以通过 key_buffer_size来设置缓存索引,提高访问性能,减少磁盘IO的压力,但缓存只会缓存索引文件,不会缓存数据。
(5)采用MylSAM存储引擎数据单独写入或读取,速度过程较快而且占用资源相对较少。
(6) MylSAM存储引擎不支持外键约束,只支持全文索引>>>
(7)每个 MylSAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型。
.frm文件存储表定义
.MYD文件存储数据(MYData)
.MYI文件存储索引文件(MYIndex)
 

 MyISAM使用的生产场景
(1)公司业务不需要事务支持
(2)一般单方读取数据比较多的业务或单方面写入数据比较多的业务,如: www.blog,图片信息数据库,用户数据库,商品库等业务,MylSAM存储引擎数据读写都比较频繁的场景不适合。
(3)对数据业务一致性要求不是非常高的业务
 (4)使用读写并发访问相对较低的业务
(5)数据修改相对较少的业务
(6)服务器硬件资源相对比较差

InnoB存储引擎介绍

<<<<记  lnnoDB的特点
(1)支持事务:支持4个事务隔离级别 acid
(2)行级锁定,但是全表扫描仍然会是表级锁定
(3)读写阻塞与事务隔离级别相关
(4)具有非常高效的缓存特性:能缓存索引,也能缓存数据
(5)表与主键以簇的方式存储
(6)支持分区、表空间,类似 oracle数据库
(7)支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
(8)对硬件资源要求比较高
>>>>

InnoDB使用的生产场景
(1)业务需要事务的支持
(2)行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引来完成
(3)业务数据更新较为频繁的场景,如:论坛,微博
(4)业务数据一致性要求较高,如:银行业务
(5)硬件设备内存较大,利用InnoDB 较好的缓存能力来提高内存利用率,减少磁盘IO的压力

企业选择存储引擎的依据

1、需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景
2、支持的字段和数据类型,所有引擎都支持通用的数据类型,但不是所有引擎都支持其他的字段类型,如二进制对象。
3、锁定类型:不同的存储引擎支持不同级别的锁定
	表锁定:MyISAM、MEMORY
	行锁定:InnoDB
	页锁定:BDB
4、索引的支持
建立索引在搜索和恢复数据库中的数据的时候能显著提高性能不同的存储引擎提供不同的制作索引的技术有些存储引擎根本不支持索引
5、事务处理的支持
事务处理功能通过提供在相关表中更新和插入信息期间的可靠性可根据企业业务是否要支持事务选择存储引擎

配置合适的存储引擎

查看数据库可配置的存储引擎
方法:登录MySQL,使用show engines;查看系统所支持的引擎
mysql -uroot -p123456 
#密码登录mysql

show engines \G   
#查看系统所支持的数据库存储引擎

#查看表正在使用的存储引擎
show engines;  
#查看当前mysql的默认引擎

方法1:
格式:show table status from 库名 where name='表名' \G;
例如:show table status from abc where mame='t2' \G;
MariaDB [auth]> show table status from auth  where name='users' \G;


方法2:
格式:show create table 表名 \G;
例如:show create table abc.t2 \G;


配置存储引擎为所选择的类型
方法1(临时)
格式:alter table 表名 engine=引擎;
例如:alter table user engine=MyISAM;

show create table user \G;  
#查看表正在使用的引擎

方法2(永久)
vim /etc/my.cnf   
#编辑mysql主配置文件
default-storage-engine=MyISAM
#默认存储引擎=MyISAM

systemctl restart mariadb   
#重启mariadb

mysql -uroot -p123456   
#密码登录mysql

show create table user;   
#查看auth数据库user表中引擎类型




应用场景



posted @ 2023-09-03 16:50  李八一  阅读(28)  评论(0)    收藏  举报