共计 4282 个字符,预计需要花费 11 分钟才能阅读完成。
这段时间单位安排了一个项目,需求方要求不能用 Oracle,必须用开源的 MySQL。这可真出了个难题,主要是我不用 MySQL 好多年。单位 dba 又是 Oracle 方向的而且在歇产假,所以只能自己上阵了。
闲话少叙,进入正题。
一、准备工作
先去官网上找 mysql 的安装包,
https://www.mysql.com/ → DOWNLOADS → Community → MySQL Community Server → MySQL Community Server 5.7.19
我的操作系统是 64 位 CentOS 7.3
在 Select Operating System: 里面没有这个系统,所以直接选的 Red Hat Enterprise Liunx / Oracle Linux
在 Select OS Version: 里选择了 Red Hat Enterprise Liunx 7 / Oracle Linux 7 (x86, 64-bit)
然后下载 RPM Bundle(mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar),大小是 565.4M
二、安装 MySQL5.7.19
下载完成后解压缩:tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar
能够解压出 12 个包:
mysql-community-client-5.7.19-1.el7.x86_64.rpm
mysql-community-common-5.7.19-1.el7.x86_64.rpm
mysql-community-devel-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.19-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.19-1.el7.x86_64.rpm
mysql-community-libs-5.7.19-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.19-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.19-1.el7.x86_64.rpm
mysql-community-server-5.7.19-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.19-1.el7.x86_64.rpm
mysql-community-test-5.7.19-1.el7.x86_64.rpm
安装新版 mysql 之前,我们需要将系统自带的 mariadb-lib 卸载
执行 rpm -qa|grep mariadb 查看系统内安装的 MariaDB 的数据库
mariadb-libs-5.5.44-2.el7.centos.x86_64
卸载 rpm -e mariadb-libs-5.5.44-2.el7.centos.x86_64 –nodeps
然后按照下面的顺序逐一安装 MySQL:
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm
在安装 server 包的时候,系统报错:
error: Failed dependencies:
libaio.so.1()(64bit) is needed by mysql-community-server-5.7.19-1.el7.x86_64
libaio.so.1(LIBAIO_0.1)(64bit) is needed by mysql-community-server-5.7.19-1.el7.x86_64
libaio.so.1(LIBAIO_0.4)(64bit) is needed by mysql-community-server-5.7.19-1.el7.x86_64
我安装了 yum install libaio 包问题解决。
error: Failed dependencies:
/usr/bin/perl is needed by mysql-community-server-5.7.19-1.el7.x86_64
perl(Getopt::Long) is needed by mysql-community-server-5.7.19-1.el7.x86_64
perl(strict) is needed by mysql-community-server-5.7.19-1.el7.x86_64
我安装了 yum install perl 包问题解决。
安装完成后初始化数据库:
执行 mysqld –initialize
执行后会在 /var/log/mysqld.log 里生成随机密码:A temporary password is generated for root@localhost: 6fQPWsSNw0-=
记住这个初始化密码,首次登陆 mysql 数据库要用到的。
更改 mysql 数据库目录的所属用户及其所属组
chown mysql:mysql /var/lib/mysql -R
启动 mysql 数据库
systemctl start mysqld.service
登陆 mysql 数据库
mysql -uroot -p’ 前面在 mysqld.log 里获取到的初始密码 ’
登陆成功后修改密码:mysql > set password=password(‘pwd_123456’);
然后修改用户允许访问数据库的 IP 和过期时间:
mysql > use mysql;
mysql > update user set host=’%’, password_expired=’N’ where host=’localhost’; // 我在这里配置的是允许任何 IP 访问,并且账户永不过期。
mysql > SELECT `Host`, `User`, password_expired FROM `user`;
mysql > flush privileges;
mysql > exit;
至此 MySQL5.7.19 已经安装完成,通过 Navicat for MySQL 链接正常。
三、搭建 MySQL 主从复制
先说一下测试环境:
主数据库的 ip 地址:172.20.1.139
从数据库的 ip 地址:172.20.1.141
确保主数据库与从数据库一模一样。
使用 root 用户分别在主数据库和从数据库上创建好库“test_db”,并且在“test_db”库里创建结构完全一样的表“t_user”。
如果创建表的时候报错(插入、修改时也可能会报这个错)
[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatiblewith sql_mode=only_full_group_by
解决办法是在 /etc/my.cnf 里加上下面这行配置:
sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’
在主数据库上创建同步账号
mysql > GRANT REPLICATION SLAVE,FILE ON *.* TO ‘ms_user’@’172.20.1.141’ IDENTIFIED BY ‘123456’;
172.20.1.141:是运行使用该用户的 ip 地址,从数据库 IP
ms_user:是新创建的用户名
123456:是新创建的用户名的密码
授权 ms_user 可以使用 test_db 库的所有权限:grant all privileges on test_db.* to ms_user@’%’ identified by ‘123456’;
配置主数据库的 my.cnf 文件
[mysqld]
server-id=1
log-bin=log
binlog-do-db=mstest // 要同步的 test_db 数据库, 要同步多个数据库,就多加几个 replicate-db-db= 数据库名
binlog-ignore-db=mysql // 不同步的数据库
配置从数据库的 my.cnf 文件
[mysqld]
server-id=2
binlog-do-db=mstest // 要同步的 test_db 数据库, 要同步多个数据库,就多加几个 replicate-db-db= 数据库名
binlog-ignore-db=mysql // 不同步的数据库
重启数据库服务
systemctl restart mysqld.service
登陆从数据库,执行语句:
mysql > change master to master_host=’172.20.1.139′, master_user=’ms_user’, master_password=’123456′, master_port=3306;
master_host:是主数据库服务器 IP 地址
master_user:是前面创建的同步账号
master_password:是同步账号的密码
master_port:是主数据库服务器的端口
mysql > start slave;
如果启动成功,可以执行 show slave status\G 检查状态,
如果 slave_io_running 和 slave_sql_running 都为 yes,那么表明可以成功同步数据了。
用 ms_user 用户登陆主数据库服务器(不要忘了给 ms_user 用户授权使用 test_db 库),向 t_user 表里插入一条记录,然后检查从数据库的 t_user,应该也出现了一条相同记录。说明部署成功。
四、后记
去 O 化是趋势,mysql 有很多种高性能的构架方式。很想好好研究研究,以后能彻底替换掉单位的 oracle 数据库。
: