之前搭建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 statusG
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 646
Binlog_Do_DB:
Binlog_Ignore_DB:
Execute开发云主机域名d_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
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 statusG
*************************** 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 statusG
*************************** 1. row *************************** File: mysql-bin.000001
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 直接应用数据即可。
[root@teststd tmp]# mysql
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 statusG
*************************** 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)
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。