[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 has started. 2022-11-11T07:01:38.574210Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2022-11-11T07:01:40.115544Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 6y*bw5N2o+bL -------------------------------------------------------[scode type="red" size=""]输入此命令后，会生成MySQL默认密码，必须记住此密码，后面连接MySQL需要用到此密码。[/scode]4.1.4测试启动MySQL/usr/local/mysql/bin/mysqld_safe --user=mysql &4.1.5测试连接MySQLmysql -uroot -p6y*bw5N2o+bL #其中，-u后面跟的内容为用户名，-p后面跟的内容为密码执行结果如下mysql -uroot -p6y*bw5N2o+bL ------------------------------------------------------- mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.31 Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> -------------------------------------------------------4.1.6创建MySQL配置文件创建mysql启动配置文件my.cnfvim /etc/my.cnf将如下内容写入至my.cnf[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock port=3306 user=mysql [mysql.server] basedir=/usr/local/mysql 4.1.7把MySQL加入systemctl创建mysql.servicevim /usr/lib/systemd/system/mysql.service写入配置文件[Unit] Description=MySQL Server After=network.target After=syslog.target [Service] ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf Restart=on-failure [Install] WantedBy=multi-user.target[scode type="green" size=""]创建mysql.service文件后，就可以在系统中用systemctl命令去启动或关闭mysql服务例如：systemctl status mysql #查看mysql启动情况 systemctl start mysql #启动mysql systemctl stop mysql #关闭mysql systemctl enable mysql #使mysql开机自启[/scode]5.设置MySQL远程连接5.1用默认密码连接MySQLmysql -uroot -p6y*bw5N2o+bL5.2修改mysql默认密码使用上述默认密码连接完MySQL后，处于安全考虑，对于很多MySQL命令使不能使用的。若不更改密码，则会出现如下错误。mysql> use mysql; No connection. Trying to reconnect... Connection id: 10 Current database: *** NONE *** ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.修改默认密码alter user user() identified by "123456";5.3允许root用户可以进行MySQL远程连接[scode type="red" size=""]允许MySQL可以用root远程连接是非常非常非常危险的事情，不可在生产环境使用！！！允许MySQL可以用root远程连接是非常非常非常危险的事情，不可在生产环境使用！！！允许MySQL可以用root远程连接是非常非常非常危险的事情，不可在生产环境使用！！！本例是开发环境，方便测试而为。[/scode]update user set host = '%' where user = 'root';刷新权限flush privileges;5.4使用navcat连接测试输入ip，端口，用户名，密码，测试连接，发现MySQL可以正常连接。
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已经被修改了。在多版本并发控制机制下，可序列化(SERIALIZABLE)级别，两次SELECT语句读到的数据都是事务1开始的快照，因此返回同样的数据。但是，如果事务1试图UPDATE这行数据，事务1会被要求回滚并抛出一个串行化失败的错误。在提交读隔离级别，每个语句读到的是语句执行前的快照，因此读到更新前后不同的值。在这种级别不会有串行化的错误（因为这种级别不要求串行化），事务1也不要求重试。幻读（Phantom read）:幻读与不可重复读类似。它发生在一个事务读取了几行数据，接着另一个并发事务出啊如了一些数据。在随后的查询中，第一个事务就会发现多了一些原本不存在的记录，就好像发生了幻觉一样，所以称为幻读。[column][block size="50%"]事务1/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;[/block][block size="50%"]事务2/* Query 2 */ INSERT INTO users VALUES ( 3, 'Bob', 27 ); COMMIT;[/block][/column]需要指出的是事务1执行了两遍同样的查询语句。如果设了最高的隔离级别，两次会得到同样的结果集，这也正是数据库在可序列化（SERIALIZABLE）隔离级别上需要满足的。但是在较低的隔离级别上，第二次查询可能会得到不同的结果集。在可序列化隔离级别，查询语句1在age从10到30的记录上加锁，事务2只能阻塞直至事务1提交。在可重复读级别，这个范围不会被锁定，允许记录插入，因此第二次执行语句1的结果中会包括新插入的行。丢失修改（Lost to modify）:指在一个事务读取一个数据时，另外一个事务也访问了该数据，那么在第一个事务中修改了这个数据后，第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失，因此称为丢失修改。[column][block size="50%"]事务1/* Query 1 */ UPDATE users SET age = 21 WHERE id = 1; /* No commit here *//* Query 1 */ SELECT * FROM users WHERE id = 1; /* will read 25 ,21 is lost*/[/block][block size="50%"]事务2/* Query 2 */ UPDATE users SET age = 25 WHERE id = 1; /* No commit here *//* Query 2 */ SELECT * FROM users WHERE id = 1; /* will read 25 */[/block][/column]