二进制安装MySQL 8.0

## 1. 二进制安装MySQL 8.0

**参考MySQL 8.0官方手册：**https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html

### 1.1 卸载之前安装或镜像自带的MySQL或Mariadb

```shell
for i in $(rpm -qa|egrep 'mysql|mariadb');do rpm -e --nodeps $i;done
rm -rf /var/lib/mysql && rm -rf /etc/my.cnf && rm -rf /usr/share/mysql && rm -rf /etc/my.cnf.d
```

### 1.2 安装依赖包

很多镜像都自带了这些依赖

```shell
yum -y install libaio numactl-libs
```

### 1.3 下载二进制包并解压

MySQL社(mian)区(fei)版下载地址：https://dev.mysql.com/downloads/mysql/

```shell
wget -P /apps https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz
cd /apps
tar xf mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz
```

嫌解压后的文件夹名称太长的话可创建软连接

```shell
ln -s /apps/mysql-8.0.23-linux-glibc2.12-x86_64 /apps/mysql
```

### 1.4 创建组和用户

```shell
groupadd mysql;useradd -r -g mysql -s /bin/false mysql
```

递归修改MySQL文件夹的属主和属组

```shell
chown -R mysql.mysql /apps/mysql
```

### 1.5 配置环境变量

```shell
echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
```

### 1.6 创建数据库目录并新建配置文件

配置文件根据自己需求和主机性能来写

```shell
mkdir -p /data/mysql/{data,log,binlog,conf,tmp}

cat > /data/mysql/conf/my.cnf <<EOF
[mysqld]
lower_case_table_names =  1 
user = mysql 
server_id =  1 
port =  3306 
default-time-zone =  '+08:00' 
enforce_gtid_consistency = ON 
gtid_mode = ON
binlog_checksum = none 
default_authentication_plugin = mysql_native_password 
datadir =  /data/mysql/data 
pid-file =  /data/mysql/tmp/mysqld.pid 
socket =  /data/mysql/tmp/mysqld.sock 
tmpdir =  /data/mysql/tmp/ 
skip-name-resolve = ON 
open_files_limit =  65535 
table_open_cache =  2000
#################innodb######################## 
innodb_data_home_dir =  /data/mysql/data 
innodb_data_file_path = ibdata1:512M;ibdata2:512M:autoextend 
innodb_buffer_pool_size = 12000M 
innodb_flush_log_at_trx_commit =  1 
innodb_io_capacity =  600 
innodb_lock_wait_timeout =  120 
innodb_log_buffer_size = 8M 
innodb_log_file_size = 200M 
innodb_log_files_in_group =  3 
innodb_max_dirty_pages_pct =  85 
innodb_read_io_threads =  8 
innodb_write_io_threads =  8 
innodb_thread_concurrency =  32 
innodb_file_per_table 
innodb_rollback_on_timeout 
innodb_undo_directory =  /data/mysql/data 
innodb_log_group_home_dir =  /data/mysql/data 
###################session########################### 
join_buffer_size = 8M 
key_buffer_size = 256M 
bulk_insert_buffer_size = 8M 
max_heap_table_size = 96M 
tmp_table_size = 96M 
read_buffer_size = 8M 
sort_buffer_size = 2M 
max_allowed_packet = 64M 
read_rnd_buffer_size = 32M 
############log set################### 
log-error =  /data/mysql/log/mysqld.err 
log-bin =  /data/mysql/binlog/binlog 
log_bin_index =  /data/mysql/binlog/binlog.index 
max_binlog_size = 500M 
slow_query_log_file =  /data/mysql/log/slow.log 
slow_query_log =  1 
long_query_time =  10 
log_queries_not_using_indexes = ON 
log_throttle_queries_not_using_indexes =  10 
log_slow_admin_statements = ON 
log_output = FILE,TABLE 
master_info_file =  /data/mysql/binlog/master.info
EOF
```

### 1.7 安装后的设置和测试

**参考MySQL 8.0官方手册：**https://dev.mysql.com/doc/refman/8.0/en/postinstallation.html

<font color=red>排错请查看错误日志：</font>

```shell
tail -f /data/mysql/log/mysqld.err
```

#### 1.7.1 初始化数据目录

使用[`--initialize-insecure`](https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_initialize-insecure)，不会`root`生成密码。

```shell
mysqld --defaults-file=/data/mysql/conf/my.cnf  --initialize-insecure  --user=mysql
```

#### 1.7.2 启动mysqld

```shell
mysqld_safe --defaults-file=/data/mysql/conf/my.cnf
pgrep mysql
```

#### 1.7.3 登录MySQL并设置密码

首次登录无需密码（如报错请检查以前的配置文件是否删除干净）

```shell
mysql -S /data/mysql/tmp/mysqld.sock
```

设置密码

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```

刷新权限列表

```sql
flush privileges;
```

查看登录主机，用户，密码信息

```sql
select host,user,authentication_string from mysql.user;
```

#### 1.7.4 将登录的sock软链接到tmp目录

```shell
ln -s /data/mysql/tmp/mysqld.sock /tmp/mysql.sock
```

### 1.8 使用systemd管理MySQL服务

**参考MySQL官方手册：**

- https://dev.mysql.com/doc/mysql-secure-deployment-guide/8.0/en/secure-deployment-post-install.html
- https://dev.mysql.com/doc/refman/8.0/en/using-systemd.html

service配置文件

```shell
cat > /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

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=notify

TimeoutSec=0

ExecStart=/apps/mysql-8.0.23-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf $MYSQLD_OPTS

EnvironmentFile=-/etc/sysconfig/mysql

LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false
EOF
```

如启动过mysql需要先将所有mysql进程kill掉，否则会占用sock套接字导致无法使用systemctl启动

```shell
pgrep mysql
kill [MYSQLPID]
```

重新加载systemctl服务,并启动mysqld

```shell
systemctl daemon-reload
systemctl start mysqld
```