• 记一次CentOS中安装 MariaDB 10.6.8 的踩坑经历


    1 背景

    新购了一个工业微型计算机,无风扇、可7*24h运行的那种,于是打算装个linux,做一下科研工作。本身也是初学linux,以前用虚拟机跑过CentOS,也经过比选,据说稳定,最终操作系统还是选它。考虑要尽快上手,本身对MySQL比较熟悉,但目前来看,MySQL在Oracle下有闭源的可能性,就选了MariaDB。CentOS 7.9 默认MariaDB yum 源版本较低(5.x),故打算从修改 yum 源开始。

    操作系统:CentOS 7.9

    数据库:MariaDB 10.6.8

    2 yum安装MariaDB 10.6.8

    2.1 添加MariaDB yum 源

    CentOS 7.9 默认yum安装的版本如下。

    $ yum info mariadb      
    Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
    
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    
    Loading mirror speeds from cached hostfile
    Available Packages
    Name       : mariadb
    Arch       : x86_64
    Epoch       : 1
    Version     : 5.5.68
    Release     : 1.el7
    Size       : 8.8 M
    Repo       : base/7/x86_64
    Summary     : A community developed branch of MySQL
    URL         : http://mariadb.org
    License     : GPLv2 with exceptions and LGPLv2 and BSD
    Description : MariaDB is a community developed branch of MySQL.
              : MariaDB is a multi-user, multi-threaded SQL database server.
              : It is a client/server implementation consisting of a server daemon (mysqld)
              : and many different client programs and libraries. The base package
              : contains the standard MariaDB/MySQL client programs and generic MySQL files

    因为系统默认从阿里的yum源下载,没有提供较新的版本,此处需要手动添加源。

    vim /etc/yum.repos.d/MariaDB.repo
    
    [mariadb]
    
    name = MariaDB
    
    # URL可替换为想用的版本的URL
    baseurl = http://yum.mariadb.org/10.6.8/centos7-amd64/
    
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    
    gpgcheck=1

    版本URL可在此处找:http://yum.mariadb.org

    重新构建缓存。

    yum clean all
    yum makecache  //此步骤是用刚才所编辑 MariaDB.repo 源的关键

    2.2 卸载旧版

    systemctl stop mariadb // 或者直接ps找出来kill掉
    
    yum remove mariadb-server mariadb mariadb-libs
    
    yum clean all

    找出并删除残留目录。

    $ find / -name mariadb     
    $ find / -name mysql 

    2.3 安装新版及启动数据库

    yum install MariaDB-server

    查看状态:

    $ systemctl status mariadb
    ● mariadb.service - MariaDB 10.6.8 database server
      Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
    Drop-In: /etc/systemd/system/mariadb.service.d
              └─migrated-from-my.cnf-settings.conf
      Active: inactive (dead)
        Docs: man:mariadbd(8)
              https://mariadb.com/kb/en/library/systemd/

    此时说明已经安装成功,直接启动。

    $ systemctl start mariadb

    再次查看状态:

    $ systemctl status mariadb
    ● mariadb.service - MariaDB 10.6.8 database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
      Drop-In: /etc/systemd/system/mariadb.service.d
               └─migrated-from-my.cnf-settings.conf
       Active: active (running) since Fri 2022-06-10 10:15:34 CST; 3s ago
         Docs: man:mariadbd(8)
               https://mariadb.com/kb/en/library/systemd/
      Process: 22045 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
      Process: 22019 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
      Process: 22017 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
     Main PID: 22031 (mariadbd)
       Status: "Taking your SQL requests now..."
        Tasks: 13
       Memory: 56.5M
       CGroup: /system.slice/mariadb.service
               └─22031 /usr/sbin/mariadbd

    说明启动成功。

    2.4 特别说明

    MariaDB 10.6.8中(包括之前几个版本,至少是10.4.12之后的版本),user 已经不是 mysql 数据库下的表,而是一个视图,故无法直接修改。如下图所示。

     主要mysql中还有两个存储过程,作者表示理解不能。关于user的设置方法参考官网手册:

    https://mariadb.com/kb/en/create-user/

    https://mariadb.com/kb/en/set-password/

    详细设置方法将在下一章介绍。

    3 修改MariaDB数据存放路径

    3.1 背景

    因为所购工控计算机包括一个256GB的SSD,以及一个1TB的2.5英寸机械硬盘,打算将数据默认存放路径设在机械硬盘中。机器上的linux采用LVM(Logical Volume Manager)进行的分区管理,机械硬盘中有500GB挂载至 /opt,具体如下。

    [root@192 ~]# lsblk
    NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda               8:0    0 238.5G  0 disk 
    ├─sda1            8:1    0     1G  0 part /boot
    └─sda2            8:2    0 207.8G  0 part 
      ├─centos-root 253:0    0   150G  0 lvm  /
      ├─centos-swap 253:1    0   7.8G  0 lvm  [SWAP]
      └─centos-var  253:2    0    50G  0 lvm  /var
    sdb               8:16   0 931.5G  0 disk 
    └─sdb1            8:17   0 931.5G  0 part 
      └─centos-opt  253:3    0   500G  0 lvm  /opt

    考虑以后数据增加,故希望将数据存储位置修改至 /opt 下。

    3.2 查看MariaDB数据当前存储位置

    [root@192 ~]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 3
    Server version: 10.6.8-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> select @@datadir;+-----------------+
    | @@datadir       |
    +-----------------+
    | /var/lib/mysql/ |
    +-----------------+
    1 row in set (0.000 sec)

    (注意,此时执行 mysql 并未要求输入用户名和密码)。通过上述查询结果可知,数据存储位置在 /var/lib/mysql 目录下。

    3.3 关闭连接MariaDB的相关程序

    这是为了避免正在连接MariaDB的程序因连接中断而报错。

    3.4 在期望位置创建数据存放目录(datadir)

    mkdir /opt/data
    mkdir /opt/data/mysql
    chown -R mysql:mysql /opt/data/mysql

    3.5 关闭mariadb服务

    systemctl stop mariadb

    3.6 复制目录文件至新目录

    cp -Rp /var/lib/mysql/* /opt/data/mysql

    3.7 修改MariaDB的config文件

    默认情况下,mysql的config信息在 /etc/my.cnf 中,为了确认 MariaDB 的config信息未发生变化,先查询该文件。

    [root@192 ~]# find / -name my.*
    /etc/my.cnf
    /etc/my.cnf.d

    结果显示相较于mysql还是有变化,下面我们来看 /etc/my.cnf 中的内容。

    #
    # This group is read both by the client and the server
    # use it for options that affect everything
    #
    [client-server]

    #
    # include *.cnf from the config directory
    #
    !includedir /etc/my.cnf.d

    此处需添加一部分内容,如下。(此处若不添加,服务器外客户端将无法访问数据库)

    #
    # This group is read both by the client and the server
    # use it for options that affect everything
    #
    [client-server]
    port=3306
    socket = /opt/data/mysql/mysql.sock
    # # include
    *.cnf from the config directory # !includedir /etc/my.cnf.d

    另外,最后一行代码

    !includedir /etc/my.cnf.d

    表示包含 /etc/my.cnf.d 目录下的所有 *.cnf 文件。我们来看下 /etc/my.cnf.d 目录下包括哪些文件。

    ls /etc/my.cnf.d/
    enable_encryption.preset  mysql-clients.cnf  server.cnf  spider.cnf

    其中有三个配置文件:mysql-clients.cnf、server.cnf、spider.cnf,其中 mysql-clients.cnf 用于配置客户端,我们不用管它,spider.cnf 也不相关,此目录下仅需要在 server.cnf 文件中配置:

    server.cnf

    #
    # These groups are read by MariaDB server.
    # Use it for options that only the server (but not clients) should see
    #
    # See the examples of server my.cnf files in /usr/share/mysql/
    #
    
    # this is read by the standalone daemon and embedded servers
    [server]
    
    # this is only for the mysqld standalone daemon
    [mysqld]
    datadir =/opt/data/mysql
    socket = /opt/data/mysql/mysql.sock

    ......

    3.8 开启数据库服务

    systemctl start mariadb

    3.9 验证

    MariaDB [(none)]> select @@datadir;
    +------------------+
    | @@datadir        |
    +------------------+
    | /opt/data/mysql/ |
    +------------------+
    1 row in set (0.000 sec)

    修改成功。

    4 MariaDB设置用户及密码(解决无密码即登录问题)

    前文所述 MariaDB v10.6.8 安装好之后不输入用户名和密码就能进入数据库查询,本章将示范如何完善密码设置。

    4.1 查看当前认证状态并修改

    select user, host, plugin from mysql.user;

    若 root 显示为 unix_socket (系统认出是root直接认证)就需要修改模式,按照官网说明(https://mariadb.com/kb/en/authentication-plugin-unix-socket/)即可。

    alter user root@localhost identified via mysql_native_password;

    修改后再查询,状态如下。

    MariaDB [mysql]> SELECT USER, host, PLUGIN FROM user;
    +-------------+-----------+-----------------------+
    | User        | Host      | plugin                |
    +-------------+-----------+-----------------------+
    | mariadb.sys | localhost | mysql_native_password |
    | root        | localhost | mysql_native_password |
    | mysql       | localhost | mysql_native_password |
    +-------------+-----------+-----------------------+
    3 rows in set (0.003 sec)

    修改成功后发现还是可以通过 mysql 或 mysql -u root 命令直接进入。此时需要重新设置密码。即使从 mysql_native_password 模式变为 mysql_native_passoword 模式,也需要设置

    4.2 重设密码

    ALTER USER `root`@`localhost` IDENTIFIED BY 'yourpassword';

    此时再尝试,如下图,则说明密码设置成功。

    [root@192 ~]# mysql -u root
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    5 外部访问数据库

    若此时从外部通过客户端工具访问数据库,会出现连不上的情况。

    Error “cannot connect to mysql server (10060)”

    可能有多个原因(Error “cannot connect to mysql server (10060)” – Here’s how to fix it),笔者遇到的是其中两个原因:1)未在mysql.user视图中添加`root`@`%`用户域;2)未将3306端口列入服务器防火墙白名单。

    5.1 在mysql.user视图中添加`root`@`%`用户域

    GRANT ALL PRIVILEGES ON *.* TO `root`@`%` IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
    MariaDB [mysql]> SELECT USER, host, PLUGIN FROM user;
    +-------------+-----------+-----------------------+
    | User        | Host      | plugin                |
    +-------------+-----------+-----------------------+
    | mariadb.sys | localhost | mysql_native_password |
    | root        | localhost | mysql_native_password |
    | mysql       | localhost | mysql_native_password |
    | root        | %         | mysql_native_password |
    +-------------+-----------+-----------------------+
    4 rows in set (0.003 sec)

    5.2 将3306端口列入服务器防火墙白名单

    首先查看防火墙状态,如下图,表示开启。

    systemctl status firewalld.service
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri ...... CST; 23h ago
         Docs: man:firewalld(1)
     Main PID: 809 (firewalld)
       CGroup: /system.slice/firewalld.service
               └─809 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    
    
    # 查看白名单列表
    firewall-cmd --zone=public --list-ports
    #此处无3306/tcp
    # 添加白名单端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent # 重启防火墙 firewall-cmd --reload # 查看白名单列表 firewall-cmd --zone=public --list-ports
    #表示3306端口已加入白名单
    3306/tcp

    关于防火墙的其它命令:

    # 查看防火墙状态,是否是running
    firewall-cmd --state
    
    # 重新载入配置,比如添加规则之后,需要执行此命令                       
    firewall-cmd --reload
    
    # 列出支持的zone
    firewall-cmd --get-zones
    
    # 列出支持的服务,在列表中的服务是放行的
    firewall-cmd --get-services
    
    # 查看已开放的端口
    firewall-cmd --zone=public --list-ports
    
    # 永久添加80端口
    firewall-cmd --add-port=3306/tcp --permanent
    
    # 永久添加80端口
    firewall-cmd --remove-port=3306/tcp --permanent 

    命令说明:

    # 作用域
    --zone
    
    # 添加端口
    --add-port=3306/tcp
    
    # 永久生效,没有此参数重启后失效
    --permanent

    参考文献:

    [1]  CentOS安装新版本MariaDB

    [2]  CentOS7下更改、移动mysql数据存储的位置(mariaDB适用)

    [3]  解决MariaDB无密码可登录

    [4]  Error “cannot connect to mysql server (10060)” – Here’s how to fix it

    [5]  CentOS 7 端口白名单设置

  • 相关阅读:
    C++对象模型
    C/C++内存结构
    第一篇
    Goodbye Steve(19552011)
    DirectX学习笔记_关于Sprite.Draw2D的说明
    Goodbye World!
    js把一个数组的数据平均到几个数组里面
    Django model字段类型清单
    Golang中间件——goredis操作Redis
    Python开发一个短网址生成器
  • 原文地址:https://www.cnblogs.com/xunzhiyou/p/16365158.html
Copyright © 2020-2023  润新知