万丈红尘千杯酒,
千秋霸业一壶茶。
Mysql 在 docker 中默认的编码字符并不是 utf8mb4。所以需要修改下.
如果没有 vim,则先安装个:
apt-get update
apt-get install -y vim
然后修改文件:
vim /etc/mysql/conf.d/mysql.cnf
修改内容为:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
重启 mysql,查看结果:
show variables like "%char%";
事务的两阶段提交:
执行器将数据更新到内存后,先写入 redo log 并记为 prepare 状态,然后写 bin log ,bin log 写成功后再将 redo log 更新为 commit 状态。这样主要是为了数据恢复或者主从同步时的数据一致性。我们可以反推下没有两阶段提交时,先写 bin log 再写 redo log 或者先写 redo log 再写 bin log 时,写完一个 log 时 crash 的情况,就可以知道 两阶段提交的重要性了。
两阶段提交,如果在 redo log 处于 prepare 状态, bin log 写完时 crash 后重启, InnoDB 会去查 bin log, 然后决定处于 prepare 状态的 redo log 是应该提交还是擦除。
redo log 和 bin log 的不同:
1. redo log 是 InnoDB 引擎提供,是一种 WAL 技术,为存储提供了 crash safe 的能力;bin log 是在 Server 层实现的,所有存储引擎都可以使用,它提供了归档的能力,我们可以用它来做数据恢复和主从同步等。
2. redo log 是物理日志,记录的是数据页上修改了什么,只能由 InnoDB 使用;bin log 是逻辑日志,记录的是操作逻辑,因此可以由不同软件进行解析。
3. redo log 是循环写,空间固定;bin log 是追加写,文件写到一定大小时会切换到下一个文件。
Mysql 可以分为 Server 层和存储引擎层。Server 层又包含连接器、分析器、优化器、执行器、查询缓存这几个部分。
1. 可以通过 show processlist 查看连接;
2. 长时间的空闲连接会被断开,可以由 wait_timeout 控制,默认 8h;
3. 长连接有内存占用的问题, MySQL5.7+可以通过 mysql_reset_connection 来重新初始化连接资源;
4. 分析器先进行词法分析,再进行语法分析;
5. 优化器决定索引的选择以及join的顺序等;
6. 执行器会检查权限。不在优化器之前执行的原因是一些操作例如触发器需要在执行器阶段才能确定;
7. 存储引擎分为InnoDB、MyISAM、Memory等引擎,其存储实现、事务支持、锁支持都是不同的,在学习过程,可以进行总结。