MySQL 8.0 OCP认证精讲视频、环境和题库之五 事务、缓存

redo log buffer:

缓存与事务有关的redo log ,用来对mysql进行crash恢复,不可禁用;

日志缓冲区是存储要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义。

默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。大型日志缓冲区使大型事务能够运行,

而无需在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新、插入或删除许多行的事务,

那么增加日志缓冲区的大小可以节省磁盘I/O

变量innodb_log_buffer_size:

指定redo log buffer的大小;

变量innodb_log_group_home_dir:

指定redo log file的路径

变量innodb_log_files_in_group :

每组日志组中包含的日志文件个数;

mysql> show variables like 'innodb_log_group_home_dir';

+---------------------------+-------+

| Variable_name | Value |

+---------------------------+-------+

| innodb_log_group_home_dir | ./ |

+---------------------------+-------+

1 row in set (0.00 sec)

mysql> show variables like 'innodb_log_files_in_group';

+---------------------------+-------+

| Variable_name | Value |

+---------------------------+-------+

| innodb_log_files_in_group | 2 |

+---------------------------+-------+

1 row in set (0.00 sec)

mysql> show variables like 'datadir';

+---------------+-------------------+

| Variable_name | Value |

+---------------+-------------------+

| datadir | /data/mysql/data/ |

+---------------+-------------------+

1 row in set (0.00 sec)

mysql>

[root@student ~]# ls /data/mysql/data/*logfile*

/data/mysql/data/ib_logfile0 /data/mysql/data/ib_logfile1

组中共有两个logfile

[root@student ~]# du -m /data/mysql/data/*logfile* #48MB

48 /data/mysql/data/ib_logfile0

48 /data/mysql/data/ib_logfile1

[root@student ~]#

mysql> show variables like 'innodb_log_file_size'; #日志大小

+----------------------+----------+

| Variable_name | Value |

+----------------------+----------+

| innodb_log_file_size | 50331648 |

+----------------------+----------+

1 row in set (0.01 sec)

mysql> select 50331648/1024/1024;

+--------------------+

| 50331648/1024/1024 |

+--------------------+

| 48.00000000 |

+--------------------+

1 row in set (0.00 sec)

mysql>

修改日志组和日志文件大小

[root@student ~]# systemctl stop mysql

[root@student ~]# cat /etc/my.cnf

[mysqld]

datadir=/data/mysql/data/

socket=/data/mysql/mysql.sock

innodb_buffer_pool_chunk_size=64M

innodb_buffer_pool_size=256M

innodb_log_file_size=100M

innodb_log_files_in_group=4

[root@student ~]# systemctl start mysql

mysql> show variables like '%innodb_log%';

+------------------------------------+-----------+

| Variable_name | Value |

+------------------------------------+-----------+

| innodb_log_buffer_size | 16777216 |

| innodb_log_checksums | ON |

| innodb_log_compressed_pages | ON |

| innodb_log_file_size | 104857600 | #100MB

| innodb_log_files_in_group | 4 | #4个logfile

| innodb_log_group_home_dir | ./ |

| innodb_log_spin_cpu_abs_lwm | 80 |

| innodb_log_spin_cpu_pct_hwm | 50 |

| innodb_log_wait_for_flush_spin_hwm | 400 |

| innodb_log_write_ahead_size | 8192 |

+------------------------------------+-----------+

[root@student ~]# du -m /data/mysql/data/ib_logfile*

100 /data/mysql/data/ib_logfile0

100 /data/mysql/data/ib_logfile1

100 /data/mysql/data/ib_logfile2

100 /data/mysql/data/ib_logfile3

[root@student ~]#

redo log buffer:缓存与事务有关的redo log,用来对mysqldi进行crash恢复,不可禁用

变量innodb log buffer size:指定redo log buffer的大小

变量innodb_log_group_home_dir:指定redo log文件的路径

变量innodb_log_files_in_group:指定Redo log.文件的数量

变量innodb_log_file_size:指定每个redo log文件的大小

实验:redo log的设置:

1、查看上述变量I

2、通过set命令指定redo log buffer的大小为32M

3、在选项文件中指定相关变量,设置redo log buffer的大小为32M,设置redo log.文件为4个,每个文件100M

重新启动mysqld服务,再此查看上述变量

存储引擎

列出 mysql所支持的存储引擎

mysql>show engines;

默认存储引擎为innoDB,不可禁用

mysql> show engines;

只有InnoDB 和DBcluster支持事务acid

mysql> use testdb

mysql> create table t1(id integer);

mysql> start transaction;

mysql> insert into t1 values(1);

mysql> select * from t1;

+------+

| id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> insert into t1 values('xyz');

ERROR 1366 (HY000): Incorrect integer value: 'xyz' for column 'id' at row 1

mysql> rollback;

mysql> select * from t1;

Empty set (0.00 sec)

#体现要么全部成功,要么全部失败

LAMP:Linux Apache mysql PHP

加锁的级别:

InnoDB:行级锁

MyISAM:表级锁

数据字典:系统表

表空间:一种逻辑结构,用于组织表和索引,位于表和数据文件之间

实验1:存储引擎

1、创建数据库testdb,进入数据库

create databases testdb;

use testdb;

2、 创建表t1,存储引擎为myisam

create table t1(id integer) engine=myisam

3、在表上执行事务,观察事务的rollback

start transaction;

insert into t1 values(100);

insert into t1 values('xyz');#观赛错误信息;

rollback ;

mysql> rollback ; #回滚之后数据还在,因为mysql 不支持ACID

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from t1;

+------+

| id |

+------+

| 100 |

+------+

1 row in set (0.00 sec)

4、创建表t2 存储引擎为innodb,在表上执行事务,观察事务的rollback

create table t2(id integer) engine=innodb;

start transaction;

insert into t2 values(100);

insert into t2 values('xyz');#观赛错误信息;

rollback; #rollback 之后,刚插入的数据全部回滚

mysql> select * from t2;

Empty set (0.00 sec)

5、 把t1表的存储引擎改为innnodb;

alter table t1 engine innodb;

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(22);

Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values('xyz');

ERROR 1366 (HY000): Incorrect integer value: 'xyz' for column 'id' at row 1

mysql> rollback;

Query OK, 0 rows affected (0.02 sec)

mysql> select * from t1;

+------+

| id |

+------+

| 100 |

+------+

1 row in set (0.00 sec)

mysql>

表空间

表空间的类型

  1. System Tablespace
  2. Undo Tablespaces
  3. General Tablespaces
  4. File-Per-Table Tablespaces
  5. Temporary Tablespace

System Tablespace

在MySQL 8.0中,InnoDB将元数据存储在MySQL数据字典中.在以前的MySQL版本中,系统表空间也包含双写缓冲区存储(Doublewrite Buffer)区域。从MySQL 8.0.20开始,此存储区域位于单独的双写文件中.

系统表空间可以有一个或多个数据文件。默认情况下,在数据目录中创建一个名为ibdata1的系统表空间数据文件。

与系统表空间有关的变量:

**innodb_data_file_path:**系统表空间数据文件的名称、初始大小和数量,是否自动扩展;

innodb_data_home_dir : 系统表空间数据文件的路径,如果为空,则是数据文件路径

**innodb_autoextend_increment:**每次扩展系统表空间时的自动扩展量

mysql> show variables like '%innodb_data%';

+-----------------------+------------------------+

| Variable_name | Value |

+-----------------------+------------------------+

| innodb_data_file_path | ibdata1:12M:autoextend |

| innodb_data_home_dir | |

+-----------------------+------------------------+

2 rows in set (0.00 sec)

[root@student ~]# du -m /data/mysql/data/ibdata1;

12 /data/mysql/data/ibdata1

mysql> show variables like 'innodb_autoextend_increment';

+-----------------------------+-------+

| Variable_name | Value |

+-----------------------------+-------+

| innodb_autoextend_increment | 64 |

+-----------------------------+-------+

1 row in set (0.01 sec)

扩展系统表空间

需要在配置文件中更改

扩容:

[mysqld]

datadir=/data/mysql/data/

socket=/data/mysql/mysql.sock

innodb_buffer_pool_chunk_size=64M

innodb_buffer_pool_size=256M

innodb_log_file_size=100M

innodb_log_files_in_group=4

#innodb_data_file_path=ibdata1:10M:autoextend

innodb_data_home_dir=

innodb_data_file_path=/data/mysql/data/ibdata1:12M;/data/mysql/data/ibdata2:480M:autoextend:max:960M
**不能通过更改现有系统表空间数据文件的大小属性来增加其大小。**例如,在启动服务器时,将innodb_data_file_path设置从ibdata1:12M:autoextend更改为ibdata1:120M:autoextend会生以下 类似错误:

[ERROR] [MY-012263] [InnoDB] The Auto-extending innodb_system data file './ibdata1' is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!

###只有最后一个文件才可以自动扩展

验证:

mysql> show variables like '%innodb_data%';

+-----------------------+--------------------------------------------------------------------------------+

| Variable_name | Value |

+-----------------------+--------------------------------------------------------------------------------+

| innodb_data_file_path | /data/mysql/data/ibdata1:12M;/data/mysql/data/ibdata2:480M:autoextend:max:960M |

| innodb_data_home_dir | |

+-----------------------+--------------------------------------------------------------------------------+

2 rows in set (0.01 sec)

mysql>

缩容

**不支持减小现有系统表空间的大小。**实现较小系统表空间的唯一选择是将数据从备份恢复到使用所需系统表空间大小配置创建的新MySQL实例。

为系统表空间使用原始磁盘分区

MySQL :: MySQL 8.0 Reference Manual :: 15.6.3.1 The System Tablespace

Temporary Tablespaces

session temporary tablespaces

InnoDB:

会话临时表空间存储用户创建的临时表和优化器创建的内部临时表。从MySQL 8.0.16开始,用于磁盘内部临时表的存储引擎是InnoDB。(以前,存储引擎由internal_tmp_disk_storage_engine的值决定。)

会话临时表空间文件创建时大小为五页,文件扩展名为.ibt。

[root@student ~]# du -m /data/mysql/data/ibtmp1

12 /data/mysql/data/ibtmp1
innodb_tmp_tablespaces_dir:变量定义了创建会话临时表空间的位置。默认位置是数据目录中的#innodb_temp目录。

INNODB_SESSION_TEMP_TABLESPACES:表提供有关会话临时表空间的元数据。

Information Schema INNODB_TEMP_TABLE_INFO:表提供了关于用户创建的临时表的元数据,这些临时表在INNODB实例中处于活动状态。

global temporary tablespace.

全局临时表空间(ibtmp1)存储对用户创建的临时表所做更改的回滚段。

innodb_temp_data_file_path

innodb_temp_data_file_path 变量定义全局临时表空间数据文件的相对路径、名称、大小和属性。如果没有为innodb_temp_data_file_path指定值,则默认行为是在innodb_data_home_dir目录中创建一个名为ibtmp1的自动扩展数据文件。初始文件大小略大于12MB。

相关推荐
kejijianwen1 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石4 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下5 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss6 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk7 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK7 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D7 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa