缓存与事务有关的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,不可禁用
只有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、创建数据库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>
表空间的类型
在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
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实例中处于活动状态。
全局临时表空间(ibtmp1)存储对用户创建的临时表所做更改的回滚段。
innodb_temp_data_file_path
innodb_temp_data_file_path 变量定义全局临时表空间数据文件的相对路径、名称、大小和属性。如果没有为innodb_temp_data_file_path指定值,则默认行为是在innodb_data_home_dir目录中创建一个名为ibtmp1的自动扩展数据文件。初始文件大小略大于12MB。