MySQL

  • TL;DR:用8.0系列中的8.0.34之后的版本,该系列版本后续主要以保障稳定、修复bug为主。MySQL 8.1、8.2都是“创新版”,很长时间都会快速迭代,稳定性要差一些,而且目前还不确定会添加哪些新功能在里面。9.0官方预计1年后就会发布,不过不重要,也会先发布Innovation版。

    MySQL在今年7月正式引入了新的版本发布模式,引入了包括8.1、8.2等版本。新的版本,给MySQL的新特性开发带了很大的好处,也让开发者容易变得困惑。这里概述一下各个版本,以及后续的版本发布规划,帮助开发者们在生产环境选择自己合适的版本。

    • 从MySQL 8.0.34开始,8.0系列将以Bugfix为主,保障稳定,是当前的LTS(Long Term Support)版本,一直到EOL(约为2026年4月)
    • 8.1/8.2版本,当前都是Innovation版本,预计在一年后,发布新的LTS版本;8.1 / 8.2 版本目前来看,还没有什么特别的功能引入,期待后续迭代
    • 对于LTS版本,其生命周期是标准的5+3年,5年“完整支持”、3年“扩展支持”
    • 预计8.4会是下一个LTS版本,在下一个LTS版本发布的时候,9.0就会正式发布,所以,9.0版本可能会在一年后就发布。届时,8.4就是8.x的LTS版本,同时发布9.0版本(Innovation版)。
    • Innovation版本,可以理解为,MySQL的官方工程师们可以“大刀阔斧”的做一些修改,除了添加新功能外,还可能删除某个功能、重构某个功能等。
    • MySQL 8.0的Premier Support将会到2025年4月;Extended Support 会到2026年4月

    参考:

  • 阿里云为ECS提供最新版本的是Alibaba Cloud Linux 3系统(3.2104 LTS 64位),根据Release Notes可以确定这是一个“CentOS 8、RHEL 8”兼容版,开始安装吧。

    1. 下载,并添加MySQL官方Yum仓库

    下载时选择Red Hat Enterprise Linux 8版本即可。

    # 下载,Centos 8版本:
    wget https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
    
    # 如果是你 Centos 7,那么可能是如下命令:
    wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
    
    # 安装配置仓库(Centos 8)
    sudo yum localinstall mysql80-community-release-el8-9.noarch.rpm
    
    # 确认与检查
    yum repolist enabled | grep mysql.*-community
    mysql-connectors-community MySQL Connectors Community
    mysql-tools-community      MySQL Tools Community
    mysql80-community          MySQL 8.0 Community Server

    2. 打开或关闭需要的子仓库

    如上面的输出,可以看到,8.0版本(mysql80-community)子仓库是默认打开的。如果要安装8.0版本,则可以跳过这一步了。但,如果要安装其他版本,例如你希望安装innovation版本,那么可以通过关闭8.0仓库,打开innovation版本子仓库的方式解决。

    # 查看有哪些子仓库,以及是否打开
    yum repolist all | grep mysql
    
    # 如果需要的话,可以禁用8.0子仓库,打开innovation版子仓库
    yum-config-manager --disable mysql80-community
    yum-config-manager --enable mysql-innovation-community
    

    我们总是可以通过yum repolist命令查看所有仓库的状态:

    yum repolist
    yum repolist enabled
    yum repolist disabled

    3. 安装需要的MySQL-Server软件

    # 查看仓库和版本
    yum list mysql-community-server
    mysql-community-server.x86_64      8.2.0-1.el8      mysql-innovation-community
    
    # 安装MySQL 8.2.0
    yum install mysql-community-server
    ...
    Complete!

    4. 启动数据库

    这是一个默认启动。

    systemctl start mysqld

    总是可以通过如下命令启动/关闭/重启或查看MySQL-Server的状态。

    systemctl start mysqld
    systemctl stop mysqld
    systemctl restart mysqld
    systemctl status mysqld

    默认的配置文件

    cat /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid

    5. 使用root账号登录数据库

    MySQL在启动时,会随机生成一个默认的root密码,首次登录需要获取该密码,并在登录后,立刻修改密码。

    获取密码:
    # 从日志文件中获取密码
    grep 'temporary password' /var/log/mysqld.log
    [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: p!5h)W9DikW/
    登录并修改密码:
    # 登录
    mysql -uroot -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.2.0
    
    Copyright (c) 2000, 2023, 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.
    
    # 修改默认的root密码
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';

    6. 一种不安全、但是偷懒的做法

    这是一种非常不安全的做法,但是很方便:可以在配置文件(my.cnf)中新增skip-grant-tables=ON参考)来关闭MySQL的用户认证与鉴权体系,谨慎使用

    这时候,就可以没有任何密码,不用关注任何权限去登录与使用数据库。不过,为了安全考虑,该参数打开后,数据库也会禁用所有远程的连接,仅允许本地的访问。

    EOF

    参考:

  • MySQL在上个月正式EOL,意味着官方不会再发布新版本去修复Bug或者安全漏洞。一般来说,云厂商对老版本支持要更就一些,那么一起来看看各个云厂商对5.7的支持情况。概述:

    • AWS:首先,AWS RDS MySQL将提供额外的、免费的半年标准支持,期间提供bug修复、漏洞修复等;2024年2月后,AWS RDS将提供付费的扩展支持。届时,如果不选择付费扩展支持的实例,将会自动(可以理解为“强制”)被升级到8.0版本,“付费”的扩展支持应该持续3年。(注:Aurora的免费支持时间会更长一些,到2024年11月)
    • 阿里云:目前,对于5.7还没有看到正式的说明。但,对于5.6版本,阿里云数据库曾发通告,将提供额外的三年维护时间。不过鉴于5.7实例体量巨大(因为8.0版本拖的时间太长),对于5.7版本支持的时间可能会更长。
    • 其他云厂商:目前都比较模糊,可以理解为不会有任何动作,用户可以正常使用。

    AWS对MySQL 5.7的支持

    AWS有Aurora MySQL 5.7(即Aurora 2.x系列)、RDS MySQL 5.7两个版本。在Oracle MySQL官方到达EOL后,AWS额外提供了半年(Aurora约一年)的免费标准支持,以及三年的付费支持。即,AWS RDS将免费支持5.7到2024年02月底,Aurora到2024年11月底;另外,还将提供三年的付费支持,约到2027年。是的,要收费的(参考)。这段时间,AWS将继续提供安全相关的Bug修复、以及重要的功能Bug修复。

    这个收费策略应该是开了云厂商对于旧版本数据库支持的先河。维护老的版本,需要额外的技术人员投入,维护一个过期的版本的投入从长时间来看,是低效的,所以,用户是需要为这部分服务付费的。

    AWS 扩展支持的收费方式与费率

    收费方式是按照vCPU * HourACU * Hour计费,不同的区域会有不同,不同的时间也会不同,离官方EOL时间越长,费用会越贵。不过,在官方版本到达EOL之后,AWS预留了4个月~一年的免费时间,让用户安排升级。以RDS MySQL 5.7为例,自2024年2月底之后,以新加坡地区为例,前两年付费扩展支持价格为 $0.12/(vCPU * Hour),第三年的费用为$0.24/(vCPU * Hour)。以一个4c16g(db.m5.xlarge)的实例计算,一个月费扩展支持费用约为$345。而该实例本身的价格约为(两节点高可用):$677 = 0.47*24*30*2。所以,AWS的策略是,价格摆在这里了,升不升级,由用户自己定夺。

    (more…)
  • 从XtraBackup的RC版本到1.0版本,一直在使用这个产品进行数据库备份。最近在群里面,依旧有一些在讨论MySQL的备份到底是应该使用物理备份还是逻辑备份。在本文中,我们将比较这两种备份方式,并提供有关它们的概要介绍。

    当前, MySQL 数据库备份,有两种主要的备份方式,即 mysqldump(逻辑备份)和 XtraBackup(物理备份)。

    mysqldump vs Xtrabackup

    mysqldumpXtraBackup
    归属Oracle MySQL(是MySQL的一部分)Percona(是一家非常了不起的MySQL开源服务商)
    备份文件格式SQL(文本)物理数据文件(二进制)
    使用场景小到中型数据库,定期备份和还原,跨版本迁移大型数据库,高性能备份和还原,避免表锁定
    优点– 备份以文本格式存储,易于查看和编辑。– 高性能备份和还原,适用于大型数据库。
    – 跨 MySQL 版本兼容性较好。– 备份期间不会锁定表,对生产环境影响小。
    – 可备份指定数据库、表或查询结果。– 支持增量备份,可节省存储空间和备份时间。
    缺点– 对于大型数据库,备份和还原速度相对较慢。– 备份文件通常较大。(通常压缩率要低一些)
    – 在备份期间,可能会锁定表,影响生产环境查询。– 不容易查看备份内容,因为是二进制备份。
    原理通过导出 SQL 语句来备份数据和结构。备份 InnoDB 存储引擎的物理数据文件和日志文件。
    增量支持不直接支持。(可以通过备份binlog来实现)支持增量备份,可减少备份数据的大小。

    一些其他的重要差异

    两者除了上述差异,根据经验一些重要的建议如下:

    • mysqldump是逻辑备份,在恢复的时候一方面跨版本的效果会更好,因为都是SQL语句;同时,也可能会因为字符集、数据库参数配置(如SQL_MODE等),导致恢复的时候失败或者出现一致性的问题。而XtraBackup是物理备份,数据一致性总是可以保障,但是跨版本恢复能力比较弱。
    • mysqldump的备份与恢复的是官方自带的产品,所以也是被广泛使用的产品,但是因为他在大数据量(例如超过几百GB)时备份的性能、恢复的性能较差,所以,XtraBackup会是很好的补充。
    • 在实践中,XtraBackup也是广泛被使用的,稳定性有比较好的保障,但是配置与使用的成本略微要高一些。在构建自己的复制方案的时候,对于大型的生产系统中,比较建议使用。

    概述mysqldump(逻辑备份)

    概要介绍: mysqldump 是 MySQL 数据库备份的一种经典工具,它通过导出 SQL 语句来备份数据库中的数据和结构。这种备份方式被称为逻辑备份,因为它备份的是数据的逻辑表示,而不是物理数据文件。以下是 mysqldump 的一些关键特点:

    • 适用性: mysqldump 适用于小型到中型的 MySQL 数据库,或者数据库大小不超过几百 GB 的情况。
    • 备份内容: mysqldump 会生成包含 CREATE TABLE 和 INSERT 语句的 SQL 文件,其中包括数据表结构和数据内容。
    • 优点:
      • 数据备份以文本格式存储,易于查看和编辑。
      • 跨 MySQL 版本的兼容性较好,可以在不同版本之间迁移备份数据。
      • 具有备份数据库、表或特定查询结果的灵活性。
    • 缺点:
      • 对于大型数据库,备份和还原速度相对较慢。
      • 在备份期间,数据库可能会锁定表,影响生产环境的查询。
      • 逻辑备份的还原速度相对较慢。

    概述XtraBackup(物理备份)

    概要介绍: XtraBackup 是一种高性能的 MySQL 物理备份工具,主要用于备份 InnoDB 存储引擎的数据文件和二进制日志文件。以下是 XtraBackup 的一些关键特点:

    • 适用性: XtraBackup 适用于大型 MySQL 数据库,对备份性能和恢复速度有高要求的情况。
    • 备份内容: XtraBackup 备份的是数据库的物理数据文件,包括 InnoDB 存储引擎的数据和日志文件。
    • 优点:
      • 高性能备份和还原,特别适用于大型数据库。
      • 备份期间不会锁定表,对生产环境的影响较小。
      • 支持增量备份,可以节省存储空间和备份时间。
    • 缺点:
      • 备份文件通常较大。
      • 不容易查看备份内容,因为它是二进制备份。

    建议

    根据你的数据库需求和性能要求,选择适当的备份方式:

    1. mysqldump: 适用于小型数据库或需要定期备份和还原的数据库,以及对备份文件易于查看和编辑的情况。
    2. XtraBackup: 适用于大型数据库或对备份性能和恢复速度有高要求的数据库,尤其是在需要避免表锁定和支持增量备份的情况下。
    3. 在某些情况下,可以结合使用两种备份方式,以满足不同的需求。这也是一种常用策略。
    4. 无论选择哪种备份方式,都应定期测试备份恢复过程,以确保备份的可用性和完整性。这一点非常重要。

    最终的选择取决于数据库的特定需求和性能要求。根据实际情况,你可以灵活地使用 mysqldump 和 XtraBackup 来满足你的数据库备份和恢复需求。

  • 在过去二十年中,移动互联网飞速发展,催生了大量LBS相关应用,这也让空间信息处理成为较为基础的诉求。PostgreSQL因为其起源就与空间信息处理关系很大,所以在该领域一直有着非常大的优势。MongoDB也在很早就对空间信息处理做了很强的支持,这也帮助MongoDB在发展过程中拿下来部分市场。MariaDB也在去年8月(参考)收购了厂商“CubeWerx”以增强其在地理信息的存储与分析上的能力。

    在过去的十年,MySQL也在不断的增强空间信息的处理能力,本文概述了,当前MySQL在这一块的能力现状。

    当前,数据库访问与处理GIS相关的信息主要参考的是:OGC Standards中的“Simple Feature Access – Part 2: SQL Option”(链接)。当前,MySQL支持的空间类型主要包括:

    • 点、折线、多边形、空间(可以存储前面三种类型中的任何一种)
    • 多点、多折线、多多边形、多空间(可以存储多个任何类型)

    使用MySQL空间类型,则最好使用InnoDB或NDB引擎(其他还支持空间类型的引擎有MyISAM、ARCHIVE),其中InnoDB支持较为完整,对空间索引也有比较好的支持。

    如果要支持地理信息,则可以使用“WGS 84系统”标准的坐标系统,正式名称是:世界大地测量系统(World Geodetic System, WGS),对应的SRID为4326。WGS是当前被广泛使用的地球空间坐标系统,例如GPS就是使用该坐标系统。该坐标系统,建立以地球的质心为中心的一套坐标系统,里面包括地球的一些基础数据等。

    在MySQL可以通过如下Query可以查看MySQL中的WGS 84系统的一些基本信息:

    SELECT *
           FROM INFORMATION_SCHEMA.ST_SPATIAL_REFERENCE_SYSTEMS
           WHERE SRS_ID = 4326\G
    *************************** 1. row ***************************
                    SRS_NAME: WGS 84
                      SRS_ID: 4326
                ORGANIZATION: EPSG
    ORGANIZATION_COORDSYS_ID: 4326
                  DEFINITION: GEOGCS["WGS 84",DATUM["World Geodetic System 1984",
                              SPHEROID["WGS 84",6378137,298.257223563,
                              AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],
                              PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
                              UNIT["degree",0.017453292519943278,
                              AUTHORITY["EPSG","9122"]],
                              AXIS["Lat",NORTH],AXIS["Long",EAST],
                              AUTHORITY["EPSG","4326"]]
                 DESCRIPTION:

    基础对象和对应的WKT表达

    MySQL或者说SQL标准中支持的对象包括如下,:Point、Linestring、Polygon、Multi Point、Multi Linestring、Multi Polygon、Geometry Collection。

    具体的:

    • Point、LineSting都比较好理解
      • 在WKT表达中,点的X/Y坐标,之间并没有逗号;但是,MySQL的Point函数,则是需要逗号的。
      • 这里省略了一个叫“LineRing”的概念,LineRing就是一个不相交且头尾相连的LineString
    • Polygon有两种,一种是普通的,一种是带hole的Polygon
    • Polygon是一个Surface,不仅仅是组成边缘的点,还包含内部覆盖区域
    • Polygon即便是普通的(不带hole),外部也会有一个括号
    • Polygon通常是由多个LineRing组成

    在这个规范下,就可以非常简单的创建OGC标准中的对象,例如:

    CREATE TABLE geom (
        id int,
        p POINT SRID 0
    );
    
    INSERT INTO geom(id,p) values (1,Point(12,30));

    在实际查询中,默认的空间类型会返回二进制类型数据,所以客户端查询需要进行一次转换,将其转换容易阅读的文本类型,即标准的WKT(Well-Known Text):

    转化前:

    mysql> select * from geom;
    +------+---------------------------+
    | id   | p                         |
    +------+---------------------------+
    |    1 |              (@      >@ |
    +------+---------------------------+
    1 row in set (0.00 sec)

    使用了WKT函数转换后:

    mysql> select id,ST_AsText(p) from geom;
    +------+--------------+
    | id   | ST_AsText(p) |
    +------+--------------+
    |    1 | POINT(12 30) |
    +------+--------------+

    好的,这是一个简单的入门介绍,更多的能力需要自己探索,祝玩得开心。

  • 使用MySQL的函数索引

    ·

    从MySQL 8.0.13起,开始支持函数索引功能,该功能可以很好的帮助开发人员或者DBA去优先生产环境的SQL语句。通常,我们是并建议在SQL语句的查询条件中对列进行任何的函数计算的,因为这种做很有可能导致原本可以使用索引的查询条件,变得无法使用索引。

    例如,我们看如下的查询条件:

    SELECT * FROM user_info WHERE substr(id_card_no,1,6) = '330106';

    虽然,该表的id_card_no上原本是存在索引的,但是上面的写法则会导致SQL无法正常使用id_card_no列上的索引。一般来说,我们会建议开发人员,避免这种写法,更多的是将表达式放到右侧,如上的SQL则建议修改为:

    SELECT * FROM user_info WHERE id_card_no like '330106%';

    但某些情况下,我们可能无法修改SQL,例如:

    • 有很多的函数计算或表达式操作并不能简单的转换到表达式的右边,例如:uid%1024 = 7
    • 应用程序来自第三方,而我们并不拥有第三方的代码,也无法进行修改SQL
    • 生产故障已经由此产生,可能来不及修改线上的代码或SQL
    • 还有一个略微“牵强”的说法:SQL语法更加注重解释性,并不关注实现,基于此大原则,上面的SQL写法并没有什么问题。

    函数索引使用示例

    MySQL的函数索引是8.0版本引入的重要特性之一。它允许开发人员在查询中使用函数,并且依旧可以有效地加速查询性能。具体的,函数索引的作用是通过在函数表达式上创建索引,在处理字符串、日期、数值等类型的数据时特别有用。

    (more…)