规划
版本选择
- 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
- mysql_install_db
- 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 不会生成随机初始化密码。
- mysqld –initialize
-
–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
- 编辑 /mdata/my.cnf
重置管理员密码
在忘记密码的情况下,重置管理员密码。
停止服务
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,去掉这个选项,以后日志增长再调整。