CentOS 7 离线安装MySQL
MySQL下载官网: https://downloads.mysql.com/archives/community/
文章使用的MySQL版本下载地址: https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
正文:
一、安装步骤:
1.1、卸载旧的MySQL
1.1.1、删除MySQL的安装文件 及 自带mariadb
查询MySQL的安装文件:
[root@localhost ~]# find / -name mysql
/opt/mysql/soft/mysql
/opt/mysql/soft/mysql/mysql
/opt/mysql/soft/mysql/mysql/bin/mysql
/opt/mysql/soft/mysql/mysql/include/mysql
/opt/mysql/soft/mysql/mysql/data/mysql
[root@localhost mysql]# rpm -qa | grep libaio
libaio-0.3.109-13.el7.x86_64
[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
警告:/etc/my.cnf 已另存为 /etc/my.cnf.rpmsave
[root@localhost mysql]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
错误:未安装软件包 mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost mysql]# rpm -e --nodeps mariadb*
错误:未安装软件包 mariadb*
[root@localhost mysql]# rpm -qa | grep mariadb
[root@localhost mysql]# rpm -qa | grep mysql
删除:
[root@localhost ~]# rm -rf /opt/mysql/soft/mysql
1.1.2、删除MySQL的配置文件
删除/etc/my.cnf文件:
[root@localhost ~]# rm -rf /etc/my.cnf
删除/etc/init.d/下跟MySQL有关的全部文件,通常包括mysql文件或者mysqld文件。/etc/init.d/目录下存放的一般都是加入系统的各个服务。
[root@localhost ~]# rm -rf /etc/init.d/mysql
[root@localhost ~]# rm -rf /etc/init.d/mysqld
1.1.3、删除MySQL用户和用户组
[root@localhost ~]# userdel mysql userdel: user 'mysql' does not exist
至此,卸载完成!
1.2、安装MySQL
1.2.1、下载安装mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
安装包下载地址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads 将下载好的mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz上传到Linux服务器并解压,笔者放到/opt/mysql/soft目录下。
[root@localhost ~]# cd /opt/mysql/soft
[root@localhost soft]# tar -zxvf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
重命名为mysql,并进入目录:
[root@localhost soft]# mv mysql-5.7.21-linux-glibc2.12-x86_64 mysql
[root@localhost soft]# cd mysql
1.2.2、添加用户组mysql和用户mysql,并将其添加到mysql用户组中
[root@localhost soft]# groupadd mysql [root@localhost soft]# useradd -r -g mysql mysql
注:
- useradd -r参数表示mysql用户是系统用户,不可用于登录系统。
- useradd -g参数表示把mysql用户添加到mysql用户组中。
查看用户以及用户组信息: cat /etc/passwd # 查看所有用户信息 cat /etc/group # 查看所有组信息 groups 用户名 # 查看当前用户所在组,以及组内其它成员的信息
1.2.3、检查是否安装了 libaio
[root@localhost mysql]# rpm -qa | grep libaio
如果没有安装,使用如下命令安装:
[root@localhost mysql]# yum search libaio [root@localhost mysql]# yum install libaio
1.2.4、配置my.cnf文件
[root@localhost mysql]# touch /etc/my.cnf
注意: 使用默认的644权限和用户,不要做修改。 将如下内容拷贝到里面:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
socket=/opt/mysql/socket/mysql.sock
[mysqld]
port=3306
datadir=/opt/mysql/data
basedir=/opt/mysql/soft/mysql
tmpdir=/opt/mysql/tmp
log-error=/opt/mysql/log/error.log
socket=/opt/mysql/socket/mysql.sock
pid-file=/opt/mysql/pid/mysql.pid
max_connections=1000
max_connect_errors=10000
connect-timeout=10
wait-timeout=28800
character-set-server=utf8
symbolic-links=0
lower_case_table_names = 1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
symbolic-links=0
# 禁用主机名解析
skip-name-resolve
# 打开慢查询日志功能
# 超过2秒的查询记录下来
slow_query_log = 1
# 记录下没有使用索引的查询
long_query_time = 2
log_queries_not_using_indexes = 0
slow_query_log_file =/opt/mysql/log/slow.log
#log=D:\\soft\\mysql-5.7.40-winx64\\slow.log
### 自动修复
# 记录 relay.info 到数据表中
relay_log_info_repository = TABLE
# 记录 master.info 到数据表中
master_info_repository = TABLE
# 启用 relaylog 的自动修复功能
relay_log_recovery = on
# 在 SQL 线程执行完一个 relaylog 后自动删除
### 数据安全性配置
relay_log_purge = 1
# wei关闭 master 创建 function 的功能
log_bin_trust_function_creators = on
# 每执行一个事务都强制写入磁盘
sync_binlog = 1
# timestamp 列如果没有显式定义为 not null, 则支持null属性
# 设置 timestamp 的列值为 null, 不会被设置为 current timestamp
#explicit_defaults_for_timestamp=true
### 优化配置
# 优化中文全文模糊索引
ft_min_word_len = 1
# 默认库名表名保存为小写, 不区分大小写
lower_case_table_names = 1
# 单条记录写入最大的大小限制
# 过小可能会导致写入(导入)数据失败
max_allowed_packet = 256M
# 半同步复制开启
#rpl_semi_sync_master_enabled = 1#rpl_semi_sync_slave_enabled = 1# 半同步复制超时时间设置
#rpl_semi_sync_master_timeout = 1000# 复制模式(保持系统默认)
#rpl_semi_sync_master_wait_point = AFTER_SYNC
# 后端只要有一台收到日志并写入 relaylog 就算成功
#rpl_semi_sync_master_wait_slave_count = 1# 多线程复制
# 基于组提交的并行复制方式
#slave_parallel_type = logical_clock
#并行的SQL线程数量,此参数只有设置 1<N的情况下才会才起N个线程进行SQL重做。
#经过测试对比发现, 如果主库的连接线程为M, 只有M < N的情况下, 备库的延迟才可以完全避免。
#slave_parallel_workers = 4
### 连接数限制
max_connections = 1500
# 验证密码超过20次拒绝连接
max_connect_errors = 200
# back_log值指出在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中
# 也就是说,如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中
# 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log
# 将不被授予连接资源
back_log = 500
open_files_limit = 65535
# 服务器关闭交互式连接前等待活动的秒数
interactive_timeout = 3600
# 服务器关闭非交互连接之前等待活动的秒数
wait_timeout = 3600
### 内存分配
# 指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间
# 该表就被打开并放入其中,这样可以更快地访问表内容
table_open_cache = 1024
# 为每个session 分配的内存, 在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 4M
# 在内存的临时表最大大小
tmp_table_size = 128M
# 创建内存表的最大大小(保持系统默认, 不允许创建过大的内存表)
# 如果有需求当做缓存来用, 可以适当调大此值
max_heap_table_size = 16M
# 顺序读, 读入缓冲区大小设置
# 全表扫描次数多的话, 可以调大此值
read_buffer_size = 1M
# 随机读, 读入缓冲区大小设置
read_rnd_buffer_size = 8M
# 高并发的情况下, 需要减小此值到64K-128K
sort_buffer_size = 1M
# 每个查询最大的缓存大小是1M, 最大缓存64M 数据
query_cache_size = 64M
query_cache_limit = 1M
# 提到 join 的效率
join_buffer_size = 16M
# 线程连接重复利用
thread_cache_size = 64
### InnoDB 优化
## 内存利用方面的设置
# 数据缓冲区
innodb_buffer_pool_size=1G
innodb_buffer_pool_instances=4
## 日志方面设置
# 事务日志大小
innodb_log_file_size = 256M
# 日志缓冲区大小
innodb_log_buffer_size = 4M
# 事务在内存中的缓冲
innodb_log_buffer_size = 3M
# 主库保持系统默认, 事务立即写入磁盘, 不会丢失任何一个事务
innodb_flush_log_at_trx_commit = 1
# mysql 的数据文件设置, 初始100, 以10M 自动扩展
#innodb_data_file_path = ibdata1:100M:autoextend
# 为提高性能, MySQL可以以循环方式将日志文件写到多个文件
innodb_log_files_in_group = 3
##其他设置
# 如果库里的表特别多的情况,请增加此值
#innodb_open_files = 800
# 为每个 InnoDB 表分配单独的表空间
innodb_file_per_table = 1
# InnoDB 使用后台线程处理数据页上写 I/O(输入)请求的数量
innodb_write_io_threads = 8
# InnoDB 使用后台线程处理数据页上读 I/O(输出)请求的数量
innodb_read_io_threads = 8
# 启用单独的线程来回收无用的数据
innodb_purge_threads = 1
# 脏数据刷入磁盘(先保持系统默认, swap 过多使用时, 调小此值, 调小后, 与磁盘交互增多, 性能降低)
innodb_max_dirty_pages_pct = 90
# 事务等待获取资源等待的最长时间
innodb_lock_wait_timeout = 120
# 开启 InnoDB 严格检查模式, 不警告, 直接报错 1开启 0关闭
innodb_strict_mode=1
# 允许列索引最大达到3072
innodb_large_prefix = on
[mysqld_safe]
log-error=/opt/mysql/log/error.log
pid-file=/opt/mysql/pid/mysql.pid
1.2.5、创建mysql、data、logs文件夹
[root@localhost mysql]# mkdir /opt/mysql/socket
[root@localhost mysql]# mkdir /opt/mysql/log
[root@localhost mysql]# mkdir /opt/mysql/data
[root@localhost mysql]# mkdir /opt/mysql/pid
[root@localhost mysql]# mkdir /opt/mysql/tmp
在logs目录下创建error.log文件,否则有可能在初始化MySQL的时候会报错。 如果没有mysqld.pid文件,在data目录下建一个mysqld.pid文件,方便起见,可将其权限设置为777:
[root@localhost mysql]# touch /opt/mysql/log/error.log
[root@localhost mysql]# touch /opt/mysql/pid/mysql.pid
[root@localhost mysql]# chmod 777 /opt/mysql/pid/mysql.pid
1.2.6、将mysql目录的所属用户和组改为mysql
[root@localhost mysql]# chown -R mysql:mysql /opt/mysql/soft/
[root@localhost mysql]# chown -R mysql:mysql /opt/mysql/data/
[root@localhost mysql]# chown -R mysql:mysql /opt/mysql/tmp/
[root@localhost mysql]# chown -R mysql:mysql /opt/mysql/log/
[root@localhost mysql]# chown -R mysql:mysql /opt/mysql/socket/
1.2.7、初始化 mysqld 生成初始化密码
[root@localhost ~]# cd /opt/mysql/soft/mysql
[root@localhost mysql]# ./bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/soft/mysql--datadir=/opt/mysql/data
此时,日志里查看: /opt/mysql/log/error.log
2022-11-28T05:59:17.073333Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2022-11-28T05:59:17.073421Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2022-11-28T05:59:17.233701Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-11-28T05:59:17.275529Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-11-28T05:59:17.334455Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: cb26703d-6ee1-11ed-a937-005056afac26.
2022-11-28T05:59:17.335828Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-11-28T05:59:19.174141Z 0 [Warning] CA certificate ca.pem is self signed.
2022-11-28T05:59:19.560730Z 1 [Note] A temporary password is generated for root@localhost: l5lliTYCkK<i
最后:l5lliTYCkK<i 就是初始化之后的密码。 二、MySQL的配置:
2.1、设置开机启动
2.1.1、复制mysql.server脚本到资源目录,并赋予执行权限:
[root@localhost mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql]# chmod +x /etc/rc.d/init.d/mysqld
2.1.2、将 mysqld 服务加入到系统服务并检测是否生效:
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# chkconfig --list mysqld
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
得到以上结果说明生效。 注:
- 查看启动项:chkconfig --list | grep -i mysqld
- 删除启动项:chkconfig --del mysqld
- 设置开机启动:chkconfig mysqld on
- 关闭开机启动:chkconfig mysqld off
启动mysqld:
[root@localhost mysql]# service mysqld start Starting MySQL. SUCCESS!
设置开机启动:
[root@localhost mysql]# chkconfig mysqld on # 设置开机启动
[root@localhost mysql]# chkconfig mysqld off # 关闭开机启动
- 因为 mysqld 不是本地服务,是我们后加的,所以想要设置开机启动务不能用 systemctl enable mysqld ,systemctl 命令只能操作正常安装在系统的本地服务,所以要通过 chkconfig 命令来实现开机启动。
通过命令查看MySQL进程,会看到MySQL已经开启了守护进程:
[root@localhost mysql]# ps -ef|grep mysql
root 24547 32698 0 14:27 pts/0 00:00:00 grep --color=auto mysql
root 27480 1 0 14:04 pts/0 00:00:00 /bin/sh /opt/mysql/soft/mysql/bin/mysqld_safe --datadir=/opt/mysql/data --pid-file=/opt/mysql/pid/mysql.pid
mysql 28029 27480 0 14:04 pts/0 00:00:01 /opt/mysql/soft/mysql/bin/mysqld --basedir=/opt/mysql/soft/mysql --datadir=/opt/mysql/data --plugin-dir=/opt/mysql/soft/mysql/lib/plugin --user=mysql --log-error=/opt/mysql/log/error.log --pid-file=/opt/mysql/pid/mysql.pid --socket=/opt/mysql/socket/mysql.sock --port=3306
其中,进程号为27480 的就是守护进程,有了守护进程,即便mysql的进程被杀掉了,守护进程也会立刻将mysql进程再次开启。 若要关闭MySQL,执行如下命令:
[root@localhost mysql]# service mysqld stop
2.2、配置环境变量
2.2.1、打开/etc/profile配置文件,添加如下内容:
# mysql环境变量
PATH=$PATH:/opt/mysql/soft/mysql/bin export PATH
2.2.2、执行命令,使其生效:
[root@localhost mysql]# source /etc/profile
2.2.3、校验是否成功:
[root@localhost mysql]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/mysql/soft/mysql/bin
出现了 /opt/mysql/soft/mysql/bin 表示以已经配置成功。
2.3、初次登录 修改访问密码
2.3.1、首次登陆
第一次登陆的时候,使用初始化的密码:l5lliTYCkK<i
[root@localhost mysql]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 5
Server version: 5.7.21
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
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.
mysql>
2.3.1、修改登陆密码
mysql> SET PASSWORD = PASSWORD('bsoft');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 1 rows affected (0.00 sec)
- 不建议使用DML语句进行更改密码,delete、update等DML语句直接修改表数据只能修改磁盘中的表数据,但并不能刷新内存中的数据,所以在操作之后,要 flush 刷新内存以保证权限的更新。建议直接使用 set、grant、revoke等间接修改表数据,这些操作会同时修改磁盘中的数据并刷新内存。
2.4、允许远程访问
mysql> grant all privileges on *.* to 'root'@'%' identified by 'bsoft' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
注意:
# 允许所有用户远程访问 修改用户名和密码为你自己的
mysql> grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
# 允许单个ip访问 修改用户名和密码为你自己的
mysql> grant all privileges on *.* to 'root'@'1.2.3.4' identified by 'password' with grant option;
# 最后
mysql> flush privileges;
此时可以查看user表中多了一个 host 为 % 的用户:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)
mysql>
检查3306端口是否开放:
[root@localhost mysql]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost mysql]# ps -ef|grep fire
root 1005 1 0 11月24 ? 00:00:01 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root 4427 32698 0 14:11 pts/0 00:00:00 grep --color=auto fire
[root@localhost mysql]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@localhost mysql]# firewall-cmd --reload
success
此时,可以使用navicat进行远程连接,或者在另外一台Linux服务器上用命令远程连接,假设MySQL所在服务器地址为 192.168.137.10:
[root@localhost ~]# mysql -h ip -u root -p
Enter password:
输入密码即可。
2.5、使用navicate远程连接报错1045
如果使用navicate进行远程连接访问,报如下错误: 1045 - Access denied for user 'root'@'192.168.137.10' (using password: YES) 解决方法如下:
2.5.1、关闭mysql服务
[root@localhost mysql]# service mysqld stop
Redirecting to /bin/systemctl stop mysql.service
2.5.2、修改/etc/my.cnf修改为无密码登录
在my.cnf配置文件添加如下内容:
# mysql无密码登录
skip-grant-tables
2.5.3、重启mysql服务
[root@localhost mysql]# service mysqld restart
Redirecting to /bin/systemctl restart mysql.service
2.5.4、无密码登录mysql
注意:此时登录不带p参数:
[root@localhost mysql]# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3
Server version: 5.7.21 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
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.
mysql>
2.5.5、再次修改mysql密码
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update mysql.user set authentication_string=password('bsoft') where user='root' ;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 2 Changed: 1 Warnings: 1
mysql>
2.5.6、然后将my.cnf无密码登录配置去掉(就是上面刚加的那句话)
2.5.7、退出mysql,并重启
mysql> quit
Bye
[root@localhost mysql]# service mysqld restart
Redirecting to /bin/systemctl restart mysql.service
[root@localhost mysql]#
再次使用navicat连接即可。
三、开启binlog日志
3.1、mysql设置binlog日志
修改 /etc/my.cnf 配置文件,在 [mysqld] 节点下添加如下配置:
[mysqld]
# 开启binlog日志
# log_bin=ON
# binlog日志的基本文件名,后面会追加标识来表示每一个文件
# log_bin_basename=/opt/mysql/log/mysql-bin
# binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
# log_bin_index=/opt/mysql/log/mysql.index
# 设置日志路径,注意路径需要mysql用户有权限写。这一个参数和上面的三个参数是相同的,mysql会根据这个配置自动 设置 log_bin 为 ON 状态,自动设置 log_bin_index 文件名为你指定的文件名后跟 .index
log-bin=/opt/mysql/log/mysql-binlog.log
# 指定当前mysql服务器的服务ID,为了区别集群内的其他mysql服务器。该参数5.7版本以下不需要设置,5.7以上的版本都要进行设置服务ID
server-id=002
# 设置日志格式,有三种:statement、row、mixed
binlog_format=mixed
# 设置binlog清理时间
expire_logs_days=7
# binlog每个日志文件的大小
max_binlog_size=100m
# binlog缓存大小
binlog_cache_size=4m
# 最大binlog缓存大小
max_binlog_cache_size=512m
# 无论是增量备份还是主从复制,都是需要开启mysql-binlog日志,最好跟数据目录设置到不同的>磁盘分区,可以降低io等待,提升性能;并且在磁盘故障的时候可以利用mysql-binlog恢复数据。
配置好之后,启动mysql,登陆。查看配置是否起作用:
mysql> show variables like '%log_bin%';
显示如下信息(log_bin的值为on),即表示设置成功。
+---------------------------------+----------------------------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------------------------+
| log_bin | ON |
| log_bin_basename | /opt/mysql/log/mysql-binlog |
| log_bin_index | /opt/mysql/log/mysql-binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------------------------+
6 rows in set (0.00 sec)