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; ![](https://file.jishuzhan.net/article/1714919128298426369/7b85659b53521e240a63ae58920f758e.webp) 只有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中,I**nnoDB将元数据存储在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](https://dev.mysql.com/doc/refman/8.0/en/innodb-system-tablespace.html "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。

相关推荐
@淡 定1 小时前
MySQL MVCC 机制解析
数据库·mysql
Chandler241 小时前
Redis:内存淘汰原则,缓存击穿,缓存穿透,缓存雪崩
数据库·redis·缓存
SRC_BLUE_171 小时前
Python GUI 编程 | QObject 控件基类详解 — 定时器
开发语言·数据库·python
DBWYX2 小时前
MySQL 进阶 面经级
数据库·mysql
喝醉酒的小白2 小时前
SQL Server:触发器
数据库
银河金融数据库3 小时前
历史分钟高频数据
数据库·金融
男Ren、麦根4 小时前
MySQL 复制与主从架构(Master-Slave)
数据库·mysql·架构
嘉友5 小时前
Redis zset数据结构以及时间复杂度总结(源码)
数据结构·数据库·redis·后端
morganmin5 小时前
(一)MySQL常见疑惑之:select count(*)和select count(1)的区别
数据库·mysql
深圳厨神6 小时前
mysql对表,数据,索引的操作sql
数据库·sql·mysql