安装 MySQL

安装 MySQL

规划

版本选择

  • MySQL 8.0.23 二进制社区 GA 发行版 (2021-01-18日发行)

用户和用户组

  • mysql.mysql

启动方式

  • systemd (/usr/lib/systemd/system/mysqld.service)

端口

  • 默认3306

server_id

  • 默认1

目录

  • 安装目录:/opt/mysql
  • 数据目录:/mdata/data
  • 配置文件:/etc/my.cnf
  • socket 文件:/tmp/mysql.sock

安装软件

卸载系统自带版本

rpm -qa | grep "mysql|mariadb" | yum remove -y

下载

下载地址

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz

解压

tar -xvf mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz -C /opt/

创建软链接

ln -s /opt/mysql-8.0.23-linux-glibc2.12-x86_64 /opt/mysql

Note: 使用软链接便于后续升级。

添加环境变量

[root@yingzai ~]vim /etc/profile
...
MYSQL_HOME=/opt/mysql
export PATH=PATH:MYSQL_HOME/bin
...
[root@yingzai ~] source /etc/profile

创建用户/用户组

groupadd -g 888 mysql
useradd -M -u 888 -g 888 -s /sbin/nologin mysql

Note: 以上纯粹是强迫症,简单添加用户可以使用 useradd mysql -M -s /sbin/nologin

创建目录

mkdir -p /mdata/data

修改目录权限

chown -R mysql.mysql /opt/mysql*
chown -R mysql.mysql /mdata
chmod 750 /mdata

安装依赖

官方文档

yum install -y libaio

Note: EL8 的系统默认没有安装 /lib64/libtinfo.so.5 ,需要手动安装 ncurses-compat-libs

yum install -y ncurses-compat-libs

验证

[root@yingzai ~]$ mysql -V
mysql  Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)

安装后

初始化数据目录

如果初始化失败,可以把数据目录下文件删除,再重新初始化。

  • 5.6版本初始化
    • mysql_install_db
      /opt/mysql/scripts/mysql_install_db --user=mysql --basedir=/opt/mysql --datadir=/mdata/data
      
  • 5.7以上版本

    MySQL 提供了两个初始化数据目录的命令,本质是相同的,唯一区别就是,是否为 ‘root’@’localhost’ 账户分配随机初始化密码。

    • mysqld –initialize
      mysqld --initialize --user=mysql --basedir=/opt/mysql --datadir=/mdata/data
      

      Note: mysqld –initialize 会生成随机初始化密码,记录下来 g0p1cwTwrK?l。

    • mysqld –initialize-insecure

      mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/mdata/data
      

      Note: mysqld –initialize-insecure 不会生成随机初始化密码。

  • –defaults-file 选项

    初始化选项还可以写进配置文件,然后在初始化命令中指定 –defaults-file 。

    • 编辑 /mdata/my.cnf
      cat > /mdata/my.cnf  /usr/lib/systemd/system/mysqld.service << EOF
      [Unit]
      Description=MySQL Server
      Documentation=man:mysqld(8)
      Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
      After=network.target
      After=syslog.target
      
      [Service]
      User=mysql
      Group=mysql
      #Type=forking 会导致启动超时
      ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
      LimitNOFILE=5000
      
      [Install]
      WantedBy=multi-user.target
      EOF
      
    • 管理服务
      systemctl daemon-reload
      systemctl start | enable | stop | status mysqld
      

重置管理员密码

在忘记密码的情况下,重置管理员密码。

停止服务

systemctl stop mysqld

跳过授权表启动

mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &

Note: –defaults-file 要作为第一个选项传入。

  • –skip-grant-tables:跳过授权表

    这里的授权表是指 mysql.user 系统表,此表记录了所有账户信息,默认情况下,在 MySQL 服务器启动时,会自动加载此表。

  • –skip-networking:跳过远程登录

    跳过远程登录,就是禁止 TCP/IP 协议,只使用本地 Unix socket 协议,可以避免在密码修改期间的不安全连接。

登录

此时,因为启动时已经跳过授权表,所以无需密码即可登录。

mysql -uroot -p -S /tmp/mysql.sock

修改密码

如果启动时跳过授权表,无法直接用 grant 授权语句,需要重新加载授权表,读取 mysql.user 系统表中的账户信息。

mysql> flush privileges;  -- 刷新权限,重新加载授权表
mysql> alter user root@localhost identified by 'new_password';

关闭数据库,正常启动

mysqladmin -uroot -p shutdown
systemctl start mysqld

登录验证

mysql -uroot -p -S /tmp/mysql.sock

错误汇总

初始化数据目录时报错

  • 错误场景
    • 初始化目录使用 –defaults-file 选项
  • 错误信息
    [root@yingzai mdata]$ mysqld --initialize-insecure --defaults-file=/pdata/3307/my.cnf
    2021-01-15T10:20:59.791546Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    2021-01-15T10:20:59.792611Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
    2021-01-15T10:20:59.792639Z 0 [ERROR] Aborting
    
    
  • 错误原因
    • 数据目录非空
    • 配置文件中多余设置导致。在用于初始化的配置文件中,只要指定 user、basedir、datadir 即可。
  • 解决方法
    • 清空数据目录
    • 初始化不指定 –defaults-file 选项,或者去除多余设置。
      mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/mdata//3307/data
      

初始化数据目录时没反应

  • 错误场景
    • 初始化时既不报错,也没有任何提示
  • 错误原因
    • 存在 /etc/my.cnf文件,初始化时会自动读取这个文件。
  • 解决方法
    • 删除默认配置文件
      rm -rf /etc/my.cnf
      

启动时报错

  • 错误场景
    • 配置文件中增加了 innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend
  • 错误原因
    • 只有 ibdata1 达到指定大小时,才会创建 ibdata2。错误日志中提示,ibdata1 实际大小比 512M 小,所以在创建 ibdata2 时报错,不满足创建 ibdata2 的条件。
  • 解决方法
    • 暂时不增加 ibdata2,去掉这个选项,以后日志增长再调整。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注