秋风 - SQL
type: channel
link: https://ronins.cn/index.php/category/sql/
description: 数据库
items: Debian ARM 64（aarch64）编译安装MySQL8.0.31
items: MySQL事务

Debian ARM 64（aarch64）编译安装MySQL8.0.31
type: item
date: 2022-11-02T14:43:00+08:00
description: [scode type="green" size=""]由于工作的原因，必须使用国产化服务器（飞腾处理器ARM64位架构），所以系统中使用的相关组件，中间件，数据库等，全部得替换成ARM架构。[/scode]飞腾处理器FT-2000+/64FT-2000+/64芯片集成64个飞腾自主研发的高能效处理器内核FTC662，采用乱序四发射超标量流水线，芯片采用片上并行系统（PSoC）体系结构，集成高效处理器核心、基于数据亲和的大规模一致性存储结构、层次二维Mesh互联网络，优化存储访问延时，提供业界领先的计算性能、访存带宽和IO扩展能力。芯片兼容64位ARMV8指令集。 该产品适用于高性能、高吞吐率的服务器领域，如对处理能力和吞吐力要求很高的行业大型业务主机、高性能服务器系统和大型互联网数据中心等。1.下载MySQL8.01.1进入MySQL官网。进入官网，点击DOWNLOAD超链接，进入下载页面。选择社区版MySQL服务器1.2选择适用于所有操作系统的源代码1.3下载源代码sudo apt-get -y install wget #安装wget工具 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.31.tar.gz #通过wget下载源代码1.4解压源代码tar -zxf mysql-boost-8.0.31.tar.gz2.安装MySQL编译先决依赖2.1根据MySQL官网手册，编译MySQL需要如下依赖[scode type="share" size=""]参考资料：MySQL官网。MySQL源码安装先决条件[/scode]名称版本CMake make3.75 或更高版本GCC 7.1 或 Clang 5 C++ 或 C99 编译器 SSL库 ncurses库22.2安装上述依赖sudo apt-get -y install gcc g++ make cmake pkg-config libssl-dev openssl libncurses5-dev3.编译MySQL3.1创建编译目录[scode type="blue" size=""]根据MySQL8官方手册，默认不可再源代码目录内编译定义是否强制进行源内构建。建议使用源外构建，因为它们允许来自同一源的多个构建，并且可以通过删除构建目录来快速执行清理。要强制进行源内构建，请使用 -DFORCE_INSOURCE_BUILD=ON.参数描述默认值起始版本废止版本FORCE_INSOURCE_BUILD是否强制进行源内构建OFF8.0.14 [/scode]创建并进入编译目录mkdir mysql-compile cd mysql-compile3.2通过cmake生成makefilecmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=../mysql-8.0.31/boost \ ../mysql-8.0.31/3.3编译MySQLmake && make install4安装MySQL4.1初始化MySQL4.1.1创建MySQL用户及MySQL用户组groupadd mysql #创建MySQL用户组 useradd -r -g mysql -s /bin/false mysql #创建MySQL用户，并使其加入MySQL用户组里4.1.2安装mysql命令cp /usr/local/mysql/bin/mysql /bin #把mysql命令复制到bin目录下，方便到处可以执行mysql命令4.1.3初始化MySQL/usr/local/mysql/bin/mysqld --initialize --user=mysql执行结果如下/usr/local/mysql/bin/mysqld --initialize --user=mysql #初始化mysql ------------------------------------------------------- 2022-11-11T07:01:38.018726Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.31) initializing of server in progress as process 56517 2022-11-11T07:01:38.081961Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization h…

MySQL事务
type: item
date: 2022-05-17T20:23:00+08:00
description: ACID名词解释原子性（Atomicity）:事务是最小的执行单位，不允许分割。事务的原子性确保动作要么全部完成，要么全部不起作用。一致性（Consistency）:执行事务前后，数据保持一致，例如转账业务中，无论事务是否成功，转账者和收款人的总额是保持不变的。隔离性（Isolation）:并发访问数据库时，一个用户的事务不被其他事务所干扰，各种并发事务之间的数据库是独立的。持久性（Durability）:一个事务被提交以后，它对数据库中的改变是持久的，即使是数据库发生故障也不应该对其有任何影响。并发事务带来的问题usersidnameage1Joe202Jill25脏读（Dirty read）:当一个事务正在访问数据并且对数据进行了修改，而这种修改还没有提交到数据库中，这时另一个事务也访问了这个数据，然后使用了这个数据。英文这个数据是还没有提交的数据，那么另外一个事务读到的这个数据是脏数据，对脏数据进行的一系列操作都是不正确的。[column][block size="50%"]事务1/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 20 *//* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 21 */[/block][block size="50%"]事务2/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; /* No commit here */ ROLLBACK; /* lock-based DIRTY READ */ [/block][/column]当一个事务允许读取另外一个事务修改但未提交的数据时，就可能发生脏读（dirty reads）。脏读和不可重复读类似，不同点在于事务2不需要提交就能造成语句1两次执行的结果不同。在未提交读隔离级别唯一禁止的是更新混乱，即早期的更新可能出现在后来更新之前的结果集中。在我们的例子中，事务2修改了一行，但是没有提交，事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话，事务1中查到的数据就是不正确的了。在这个例子中，事务2回滚后就没有id是1，age是21的数据行了。不可重复读（Lost to modify）:指在一个事务内多次读统一数据。在这个事务还没结束时，另一个事务也访问该数据。那么，在第一个事务中的两次读数据之间，由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况，因此称为不可重复度。[column][block size="50%"]事务1/* Query 1 */ SELECT * FROM users WHERE id = 1;/* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT; /* lock-based REPEATABLE READ */[/block][block size="50%"]事务2/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency control, or lock-based READ COMMITTED */ ROLLBACK; /* lock-based DIRTY READ */ [/block][/column]在这个例子中，事务2提交成功，因此他对id为1的行的修改就对其他事务可见了。但是事务1在此前已经从这行读到了另外一个“age”的值。在可序列化（SERIALIZABLE）和可重复读的隔离级别中，数据库在第二次SELECT请求的时必须返回更新之前的值。在提交读和未提交读中，返回的是更新之后的值，这个现象就是不可重复读。有两种策略可以避免不可重复读。一个是要求事务2延迟到事务1提交或者回滚之后再执行。这种方式实现了T1, T2 的串行化调度。串行化调度可以支持可重复读。另一种被用在多版本并发控制的策略是允许事务2先提交，这样能得到更好的并发性能。但因为事务1在事务2之前开始，事务1必须在其开始执行时间点的数据库的快照上面操作。当事务1最终提交时候，数据库会检查其结果是否等价于T1, T2串行调度。如果等价，则允许事务1提交，如果不等价，事务1需要回滚并抛出个串行化失败的错误。使用基于锁的并发控制，在可重复读的隔离级别中，ID=1的行会被锁住，在事务1提交或回滚前一直阻塞语句2的执行。在提交读的级别，语句1第二次执行，age已经被修改了。在多版本并发控…