Mysql - 从一个小 case 理解 MVCC
从 innoDB 的一致性非锁定读说起
非锁定读和行快照数据
一致性的非锁定读(consistent nonlocking read)是指 InnoDB 存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行 DELETE 或 UPDATE 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据,下图是关于快照数据的一个简单示图:
一致性的非锁定读(consistent nonlocking read)是指 InnoDB 存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行 DELETE 或 UPDATE 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 存储引擎会去读取行的一个快照数据,下图是关于快照数据的一个简单示图:
日志文件记录了影响 mysql 数据库的各种类型活动,mysql 中常见的日志文件主要包括以下 4 种:
这些日志文件可以帮助我们对mysql数据库的运行状态进行诊断,从而更好的进行数据库层面的优化。
近期的一个项目,需要使用 MySQL 5.7,但是甲方所提供的机器是不能访问外网环境的,所以只能通过离线安装的方式来搞,这里大概记录一下,备忘。
选择 Linux - Generic
-> Compressed TAR Archive:(mysql-5.7.18-linux-glibc2.12-x86_64.tar.gz)
,版本按需下载即可;下面是具体的安装过程。
1 | rpm -qa | grep mariadb |
为了数据库管理,对于安装的 MySQL 数据库,生产上我们都会建立一个 mysql用户和mysql用户组。
1 | # 先检查mysql用户和用户组有没有被使用 |
如果甲方提供了 访问 VPN ,那么则通过 VPN 建立连接;或者通过甲方提供的方式将文件上传到指定的机器上
1 | # 解压安装包,解压后会有一个mysql-5.7.18-linux-glibc2.12-x86_64.tar.gz包 |
按照下面的操作执行
1 | cd /usr/local/ |
默认这个配置文件是不存在的,需要创建,并且填入配置信息;在 /usr/local/mysql/ 目录下创建文件并编辑
1 | cd /usr/local/mysql/ |
具体配置信息大致如下
1 | [mysql] |
进入 /usr/local/mysql/ 目录下,执行安装操作。
1 | # 执行安装命令 |
安装后,如下信息表示安装成功
2023-03-23 14:32:16 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld –initialize
2023-03-23 14:32:20 [WARNING] The bootstrap log isn’t empty:
2023-03-23 14:32:20 [WARNING] 2023-03-23T06:32:16.437877Z 0 [Warning] –bootstrap is deprecated. Please consider using –initialize instead
2023-03-23T06:32:16.438432Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2023-03-23T06:32:16.438439Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
安装成功后设置文件及目录权限:
1 | # 在 /usr/local/mysql 目录下执行 |
/etc/init.d/mysqld restart
我的机器上是出现了如下的报错
1 | ERROR! MySQL server PID file could not be found! |
如果 /usr/local/mysql/data/localhost.localdomain.err 这个文件存在,就进去看一下具体原因,如果没有就按照以下步骤执行。
1 | # 创建 /var/lib/mysql/ |
配置环境变量,在配置文件中 export PATH=$PATH:/usr/local/mysql/bin
1 | # 修改配置文件 /etc/profile |
然后重新启动即可。
1 | [root@localhost mysql]# cat /root/.mysql_secret |
1 | mysql -uroot -p |
解决方案:
1、首先保证在 my.cnf 文件中 socket 的配置如下:
1 | ... |
2、对 /tmp/mysql.sock 和 /var/lib/mysql/mysql.sock 建立软连接
1 | ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock |
1 | # 执行语句如下 |
1 | # 切换到 mysql 数据库 |
1 | # 将mysqld服务加入到系统服务 |
此时如果通过 远程访问还是访问不通,则可能是因为防火墙的问题;这里有两种解决办法
1 | systemctl stop firewalld |
1 | firewalld-cmd --zone=public --add-port=3306/tcp --permanent |
最近在搞 Apollo ,熟悉的同学应该知道,Apollo 需要依赖 Mysql。本以为很容易搞定,但是却踩了一路坑,眼高手低,也参考了网上很多博客,果然是残缺就是美!本篇就简单记录一下这个过程,以便后面参考。
| 软件 | 版本|
| ———— | ———— |
|linux | centOS 7|
| jdk | 8 |
| mysql| 5.7.24 |
随着业务的发展,越来越多的应用系统都从一个大的系统分拆成多个小的系统,各个系统之间通过一定的通信协议进行数据交换。这样就会导致一些小的应用系统自己不用去进行数据库的操作,只需要进行一些rpc调用或者缓存就可以拿到数据进行展示。我之前参与的一个项目就是这样的情况,而我也是将近7个多月的时间没有写过一行SQL。
近期参与的一个项目的数据大多都市基于数据库来进行数据交互的,所以免不了的要写大量的 SQL,所以本篇就总结一下一些 SQL 的基本写法,以备后用。