MySQL 5.7安装部署总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 之前搭建MySQL环境都是使用公司内部使用的脚本,其实说实话屏蔽了很多细节,对MySQL的安装还是了解比较肤浅,今天有个MySQL 5.7的数据迁移的任务,也是为了熟悉安装过程就走了一遍安装的流程,整体和5.6差别不大,这里演示安装的都是Percona发布的二进制版本,和MySQL官方的是完全兼容,当然也揉入了Percona一些自己的东西。

之前搭建MySQL环境都是使用公司内部使用的脚本,其实说实话屏蔽了很多细节,对MySQL的安装还是了解比较肤浅,今天有个MySQL 5.7的数据迁移的任务,也是为了熟悉安装过程就走了一遍安装的流程,整体和5.6差别不大,这里演示安装的都是Percona发布的二进制版本,和MySQL官方的是完全兼容,当然也揉入了Percona一些自己的东西。
首先就是安装路径和数据路径分离,这一点尤其重要。当然不是MySQL 5.7中开始,之前安装的时候,虽然最后也能成功,但是这一块就比较乱。
二进制包是以.tar.gz这样的文件,可以自行下载,假设我们解压后方到了mysql5.7这个目录下,我们把它放到/usr/local下,这个才是大本营。# mv /tmp/mysql5.7 /usr/local/mysql# mv /tmp/mysql5.7 /usr/local/mysql

然后根据需要创建相应的数据目录。

#mkdir -p /home/mysql

这里我们指定两个变量basedir指向安装目录,datadir指向数据目录
basedir=/usr/local/mysql
datadir=/home/mysql
初始化系统环境,比如创建用户,组之类的。

chattr -i /etc/shadow /etc/group /etc/gshadow /etc/passwd
/usr/sbin/groupadd mysql
/usr/sbin/useradd mysql -g mysql -d /home/mysql -s /sbin/nologin
chattr +i /etc/shadow /etc/group /etc/gshadow /etc/passwd

这个就是老套路了。

然后从support-files里面拷贝启动脚本,放到自启动设置中

cp -rf $basedir/support-files/mysql.server /etc/init.d/mysql

而下面的设置就是创建一些软连接,是的/usr/bin中可以正常访问mysql的几个常用命令行工具。

chown -R mysql:mysql $basedir $datadir
ln -f -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -f -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
ln -f -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin
ln -f -s /usr/local/mysql/bin/mysqlshow /usr/bin/mysqlshow
ln -f -s /usr/local/mysql/bin/mysqld /usr/bin/mysqld

设置MySQL自启动

/sbin/chkconfig --add mysql
/sbin/chkconfig --level 2345 mysql on

其实看看这些步骤,其实如果全是手动档,其实也可以,这样就是为了方便,统一管理。

    然后我们来做几件事情,先来设置参数文件,可以从support-files里面拷贝一个模板,在这个基础上改进,或者基于现有的项目的模板也可以。

cp $basedir/support-files/my.cnf.nor /etc/my.cnf

这个地方还是需要设置字符集:

客户端

default-character-set=utf8

服务器端

character-set-server = utf8

完成之后,这个时候先不要急着service mysql start,肯定会有下面的问题。

# service mysql start
Starting MySQL (Percona Server)........ ERROR! The server quit without updating PID file (/var/lib/mysql/teststd.cyou.com.pid).

而查看错误日志就会看到很明显的问题:2016-11-09T14:15:01.952812+08:00 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
2016-11-09T14:15:01.952883+08:00 0 [ERROR] Aborting

我们需要初始化数据字典,这里就需要注意一点,如果使用如下的命令会提示已经过期了。

mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql

推荐的方式是:

mysqld  --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql

这个操作比较没有任何日志提示就成功了。

再次尝试就没有问题了。

[root@teststd bin]# service mysql start
Starting MySQL (Percona Server)...... SUCCESS!

而接下来的事情也需要格外注意,那就是MySQL 5.7中的秘密设置,它基于安全的考虑,会设置一个默认的密码。

直接登录是会报错的。

[root@teststd bin]# mysql
Logging to file '/home/mysql/query.log'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

怎么查看默认密码呢,可以在启动的日志里面,我是在error.log里面看到的。

[root@teststd mysql]# grep password *.log
error.log:2016-11-09T14:28:51.344922+08:00 1 [Note] A temporary password is generated for root@localhost: aUpmj1zs8M%p
error.log:2016-11-09T14:29:39.745255+08:00 2 [Note] Access denied for user 'root'@'localhost' (using password: NO)
query.log:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

按照提示输入密码,就可以成功登录了。

[root@teststd mysql]# mysql -u root -p
Logging to file '/home/mysql/query.log'
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

不过需要马上修改密码,要不什么命令都运行不了,会一直提示你修改密码。

> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

修改密码

> set password=password('mysql');
Query OK, 0 rows affected, 1 warning (0.01 sec)

整个过程就顺利完成了,后面想继续修改密码,有几种写法,大同小异。

update user set authentication_string=PASSWORD('mysql') where User='root';

接下来就是搭建从库了,不搭建从库这个环境就是不完整的。

新版本的主库已经启用了GTID

> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 646
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: c6d66211-a645-11e6-a2b6-782bcb472f63:1-135
1 row in set (0.00 sec)

开了binlog,比如下面的几个参数:

| log_bin                                                  | ON                          
| log_bin_basename                                         | /home/mysql/mysql-bin       
| log_bin_index                                            | /home/mysql/mysql-bin.index
| binlog_format                                            | ROW

还有一个重要的设置就是server-id

[root@testdb2 ~]# mysqladmin var|grep server_id                
| server_id                                                | 20

这里简单提一下,server-id的格式比较单一,不能有其它的字符,比如 ,  _  -这样的字符,否则启动的时候会有报错。

2016-11-09T06:48:16.918807Z 0 [ERROR] Unknown suffix '_' used for variable 'server_id' (value '130_58')
2016-11-09T06:48:16.918934Z 0 [ERROR] /usr/local/mysql/bin/mysqld: Error while setting value '130_58' to 'server_id'
2016-11-09T06:48:16.918981Z 0 [ERROR] Aborting   
不少大公司在这方面还是有一些的规范的。

假设我就设置简单一些,按照IP末尾来设置server-id

# mysqladmin var|grep server_id
| server_id                                                | 58 

有个细节说一下,还是server-id,

在参数文件/etc/my.cnf里面是:

server-id = 58但是查看参数设置可以看到是server_id,一个是横线,一个是下划线

[root@teststd mysql]# mysqladmin var|grep server_id
| server_id                                                | 58  

我们在主库全库导出:

主库:

[root@testdb2 ~]# mysqldump -f -hlocalhost -uroot --default-character-set=utf8 --single-transaction -R --triggers -q --all-databases |gzip> master.dmp.gz
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
从库应用可能会有这样的错误。

# mysql < master.dmp
Logging to file '/home/mysql/query.log'
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

很简单,我们这是一个从库,show master应该不会有GTID的信息

> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000005
         Position: 194
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: c6d66211-a645-11e6-a2b6-782bcb472f63:1-135
1 row in set (0.00 sec)

在从库做一个reset操作即可。

> reset master;
Query OK, 0 rows affected (0.02 sec)

再次查看,从库上show master就没有GTID的干扰了.

> show master status\G

*************************** 1. row ***************************             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: 直接应用数据即可。

[root@teststd tmp]# mysql < master.dmp
Logging to file '/home/mysql/query.log'


主库的配置一个同步用户:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl12345';


从库使用GTID的方式自动应用

CHANGE MASTER TO  
     MASTER_HOST='10.127.128.99',    
     MASTER_USER='repl',    
     MASTER_PASSWORD='repl12345',    
     MASTER_PORT=3306,    
     MASTER_AUTO_POSITION = 1;

然后启动从库的日志应用即可。

> start slave;
Query OK, 0 rows affected (0.01 sec)

slave就这样搭建好了,简单的验证就是使用show slave status了。

> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.127.128.99
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 142343798
               Relay_Log_File: teststd-relay-bin.000002
                Relay_Log_Pos: 717
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ...
          Exec_Master_Log_Pos: 142343798
              Relay_Log_Space: 926
              ...
        Seconds_Behind_Master: 0
     ...
             Master_Server_Id: 20
                  Master_UUID: 8fc8d9ac-a62b-11e6-a3ee-a4badb1b4a00
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
         ...
           Retrieved_Gtid_Set: 8fc8d9ac-a62b-11e6-a3ee-a4badb1b4a00:1090
            Executed_Gtid_Set: 8fc8d9ac-a62b-11e6-a3ee-a4badb1b4a00:1-1090
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
Kubernetes Cloud Native 关系型数据库
提升数据安全与性能,掌握Helm一键部署MySQL 8.0主从技巧
【4月更文挑战第9天】提升数据安全与性能,掌握Helm一键部署MySQL 8.0主从技巧
256 0
|
9天前
|
Kubernetes 关系型数据库 MySQL
k8s快速部署MySQL单机
k8s快速部署MySQL单机
|
4天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
4月前
|
关系型数据库 MySQL 网络安全
Docker部署MySQL,2024网络安全通用流行框架大全
Docker部署MySQL,2024网络安全通用流行框架大全
|
4天前
|
存储 关系型数据库 MySQL
使用Docker快速部署Mysql服务器
本文介绍了如何使用Docker快速部署MySQL服务器,包括下载官方MySQL镜像、启动容器、设置密码、连接MySQL服务器以及注意事项。
59 18
|
16天前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
33 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
30天前
|
存储 关系型数据库 MySQL
[mysql]MGR简介与部署
[mysql]MGR简介与部署
|
14天前
|
关系型数据库 MySQL 测试技术
使用docker部署MySQL测试环境
使用docker部署MySQL测试环境
14 0
|
14天前
|
固态存储 关系型数据库 MySQL
mysql多实例一键部署
mysql多实例一键部署
14 0
|
17天前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。

热门文章

最新文章

下一篇
DDNS