mysql存储引擎

mysql存储引擎

存储引擎概念

存储引擎就是一种数据库存储数据的机制,索引的技巧,以及锁定水平.

存储的方式和存储的格式

存储引擎也属于mysql当中的组件,实际上操作的,执行的就是数据的读写I/O

mysql的存储引擎的分类

vim /etc/my.cnf
default-storage-engine=innodb
#mysql5.5之后默认开始使用innodb事务型速记存储引擎,支持acid(事务),支持行锁定


#5.5之前默认的存储引擎,插入的速度和查询速度很快,但是不支持事务.
#memory:内存型存储引擎索引,数据在写时都保存在内存当中,一旦重启所有数据全部消失.
#csv,逗号分割数据存储引擎,数据文件.csv文件保存的为了方便execl表格保存,保存的文件就是一个普通的文本文件,没有加密,也不支持索引.

innodb

1.读写阻塞(锁表)和事务的隔离级别.

2.能高效的缓存数据支持多种类的索引.

3.表的索引类型默认是btree

4.支持外键,支持全文索引

5.对硬件的资源要求比较高

6.行级锁定,会把行锁住,禁止操作

#模糊查询:like进行查询时,会进行全表扫描,在扫描的过程中,会锁定整个表,只能查

#没有创建索引的列进行查询时,也会锁定整个表

#使用的是索引列,锁定条件的行,行锁定

#工具
#查看存储引擎
show engines;
#更改存储引擎最直接的方法就是改配置文件,vim /etc/my.cnf

innodb行锁和索引的关系

行锁是通过索引来实现的.

如果没有索引,innodb会使用默认的隐藏索引来对记录进行加锁

加了索引就是锁行,不加索引就是锁表.

show engines;

create database xy102;

create table student (
	id int(5),
	name char(10),
	age int(3),
	sex char(2)
);

alter table student add primary key(id);

insert into student values(1,'小明',18,'男');
insert into student values(2,'小红',19,'女');
insert into student values(3,'小刚',19,'男');
insert into student values(4,'小绿',17,'女');
insert into student values(5,'小黑',20,'男');

show index from student;


终端里
mysql -u root -p123456
use xy102;
begin;
delete from student where name='小明';

#commit;
工具里
update student set age=26 where name='小明'; 

#mysql默认就是自动提交写入

#oracle是提交才能写入,相当于sed 和sed -i 

当指定条件不是索引的时候,会锁住全表.

当指定条件是索引的时候,只会锁住单独的那一行.

死锁:事务相互等待对方的资源,最后形成一个环路造成的.

如果发生了死锁,数据库会自动选择一个事务做为受害者,这个受害者会回滚该事务以解除这个死锁.

mysql则会终止其中一个数据,但是不会回滚

for update 排他所,当一个事务的操作未完成时,其他事务可以读取但是不能写入.写锁

create table t1(id int primary key, name char(3), age int);
insert into t1 values(1,'aaa',22);
insert into t1 values(2,'bbb',23);
insert into t1 values(3,'aaa',24);
insert into t1 values(4,'bbb',25);
insert into t1 values(5,'ccc',26);
insert into t1 values(6,'zzz',27);

select * from t1;

终端
begin;
delete from t1 where id =5;

工具
begin;
select * from t1 where id =1 for update;
update t1 set name='asd' where id=5;

如何避免死锁的情况出现

1.以固定的顺序访问表和行

2.把大事务尽量拆分成小事务,一条语句不要复杂

3.为表添加合理的索引,比如

mysql数据库如何进行备份

mysql的备份和恢复和日志管理(配置文件当中的设置)

备份的目的

备灾,防止数据丢失.

在生产环境中,数据的安全性非常重要.

造成数据丢失的原因

1.程序出错

2.人为的问题

3.磁盘故障

备份的分类

备份的前提,数据的版本要一致

或者

低版本备份的数据备份传给高版本的

物理备份

对磁盘或者对文件直接进行备份

热备份

联机备份,不用关闭程序就可以对资料进行备份

逻辑备份

根据数据库文件当中保存的sql语句,表结构,等等,以特定的格式和命令对文件的内容进行还原,属于热备份的一种,只能对表备份,库如果没了就没有办法恢复(主从复制除外)

冷备份

脱机备份,先把指定的程序关闭,然后对资料进行备份

全量备份

把数据库的内容整个一次性的做备份.

全量备份示例

方法1

工具
create table if not exists info1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id)
);

insert into info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');


终端
#mysql 1
systemctl stop mysqld
#所有数据都默认保存在/data目录下
#vim mysql.cnf
#basdir=	安装目录
#datadir=	数据保存目录
#压缩工具
yum -y install xz
tar -Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data
cd /opt

#mysql 2
[root@test2 ~]# cd /opt/
[root@test2 opt]# scp root@192.168.118.10:/opt/mysql_all_2024-07-19.tar.xz /opt/
[root@test2 opt]# tar -xf mysql_all_2024-07-19.tar.xz 
[root@test2 opt]# cd /opt/usr/local/mysql/
[root@test2 mysql]# systemctl stop mysqld.service 
[root@test2 mysql]# rm -rf /usr/local/mysql/data/
[root@test2 mysql]# cp -a data/ /usr/local/mysql/
[root@test2 mysql]# cd /usr/local/mysql/data
[root@test2 data]# systemctl restart mysqld

工具
连接数据库查看

方法2

mysql自带的备份命令,可以备份库,也可以备份库里面的表

mysqldump

备份一个库

终端
mysql -u root -p123456
use xy102;
show tables;
exit;

mysqldump -u root -p123456 --databases xy102 > /opt/xy102.sql
mysql -u root -p123456 < /opt/xy102.sql

工具查看

备份多个库

mysqldump -u root -p123456 --databases xy102 xy103 > /opt/xy102-103.sql
mysql -u root -p123456 < /opt/xy102-103.sql

备份全部库

mysqldump -u root -p123456 --all-databases > /opt/all/sql
mysql -u root -p123456 < /opt/all.sql

备份表

mysqldump -u root -p123456 xy102 t1 > /opt/xy102_t1.sql
mysql -u root -p123456 xy102 < /opt/xy102_t1.sql

备份多个表

mysqldump -u root -p123456 xy102 t1 t2 > /opt/xy102_t1t2.sql
mysql -u root -p123456 xy102 < /opt/xy102_t12.sql

增量备份示例

前提:开启二进制日志功能

STATEMENT 基于sql语句:只是记录用户操作的sql语句,在高并发的情况下,记录操作的sql语句顺序可能会出错,导致恢复数据的时候就会有丢失,或者误差,但是他的效率高

ROW 基于行,记录每一行的数据,准确,高并发也不会出错,但是恢复的效率低,然后

MIXED 混合模式,正常情况下使用statement,高并发使用row,交由数据库自己判断.

#binlog	逻辑备份,会生成一个文件,这个文件里面包涵了sql语句,需要使用特定的方式和语句才能够恢复

vim /etc/mysql.cnf

#server-id =1 的下面添加,开启二进制功能

log -bin=mysql-bin

#记录二进制日志文件格式

binlog_format=MIXED

#开启通用查询日志
general_log=ON 

#查询日志的保存位置
general_log_file=/usr/local/mysql/data/mysql_general.log

#错误日志的保存位置,默认是开启的
log-error=/usr/local/mysql/data/mysql_error.log

#开启慢查询日志
slow_query_log=ON

#慢查询日志的保存位置
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log

#超过五秒的记录都会保存
long_query_time=5

:wq

systemctl restart mysqld
cd 

#查看一下二进制记录
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001
#工具删表实验
#
#开启断点,让后续的操作都进入000002
mysqladmin -u root -p123456 flush-logs


mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000001|mysql -u root -p

从开始位置恢复

mysqlbinlog --no-defaults --start-position='8224' mysql-bin.000001 | mysql -u root -p123456

从指定区间开始恢复

mysqlbinlog --no-defaults --start-position='8224' --stop-position='9042' mysql-bin.000001 | mysql -u root -p123456

从指定时间开始恢复

mysqlbinlog --no-defaults --start-datetime='2024-07-19 13:48:16' --stop-datetime='2024-07-19 13:49:31' mysql-bin.000001|mysql -u root -p123456

现有需求:本地数据库迁移到阿里云上.

库名xy102

表名 test01

​ 三条数据

​ test02

​ 三条数据

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值