0基础自学linux运维-2.19-centos7 mysql5.7主从

前言

一般小公司安装完免费开源的数据库之后会做数据库主从,这个是很常见的方式,所以我这里写了一下mysql主从。

一、环境配置

1.1 环境

1)主库:mysql安装并配置好

1.系统版本:

[root@vm5 ~]# cat /etc/redhat-release

CentOS release 6.5 (Final)

2.内核:

[root@vm5 ~]# uname -r

2.6.32-431.el6.x86_64

3.IP地址:192.168.0.75(内网,实际上是没有内网的)

4.mysql版本:

[root@localhost ~]# mysql -V

mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64)using  EditLine wrapper

5.mysql安装方式:yum


2)从库:需要重新安装

1.系统版本:预定CentOS Linux

release 7.2.1511 (Core)

2.内核:3.10.0-327.el7.x86_64

3.IP地址:202.x.x.x(外网)、192.168.0.76(内网)

4.mysql版本:5.7.17-1

5. mysql安装方式:yum(方便更新数据库)


2.关闭防火墙iptables/firewalled(主从)

如果不关闭防火墙的话,可以在防火墙中添加允许3306端口访问,这里不作详解

#centos6.5

/etc/init.d/iptables stop

chkconfig iptables off

#centos7禁止firewall开机启动

systemctl stop

firewalld.service

systemctl disable

firewalld.service

3.禁止selinux(主从)

#如果执行“cat /etc/selinux/config”,其中“SELINUX=disabled”则不需要做

#临时关闭防火墙

setenforce off

#永久性关闭防火墙,需要重启服务器

vim /etc/selinux/config

把“SELINUX= enforcing”改为“SELINUX=disabled

#重启服务器

shutdown -r now

4.时间同步(主从)

#如果“crontab -l”有“/usr/sbin/ntpdate pool.ntp.org”时间同步了,则不需要再配置

yuminstall ntp -y

/usr/sbin/ntpdatepool.ntp.org

echo'#time sync by hua'>>/var/spool/cron/root

echo'*/30 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null2>&1'>>/var/spool/cron/root

crontab-l

5.基础安装(主从)

#安装一些常用到的基础命令

yum install -y gcc gcc-c++ vim lrzsz

wget curl man tree rsync

#修改连接数

echo ' #by hua'>> /etc/security/limits.conf

echo '* soft nofile

65535'>> /etc/security/limits.conf

echo '* hard nofile

65535'>> /etc/security/limits.conf

ulimit -n

#重启服务器

shutdown -r now

ulimit -n


二、mysql5.7 yum安装(主库)

2.1.mysql安装(yum)

rpm -ih http://repo.mysql.com/mysql57-community-release-el6.rpm

yum install mysql mysql-server mysql-devel

2.2.修改配置文件

#1)建立相关目录:

mkdir -p

/disk1/logs/mysql/mysql5.7/error

mkdir -p

/disk1/logs/mysql/mysql5.7/slow

mkdir -p /disk1/mysqlData

chown mysql.mysql -R

/disk1/logs/mysql

chown mysql.mysql -R

/disk1/mysqlData

#2)修改my.cnf配置

mv /etc/my.cnf /etc/my.cnf.orig

vi /etc/my.cnf

#编辑配置文件并修改,黑色粗体部分为添加的,删除线部分是修改的,普通黑色是原来的

[client]

default-character-set=utf8


[mysql]

default-character-set=utf8


[mysqld]

#datadir=/var/lib/mysql

datadir=/disk1/mysqlData

socket=/var/lib/mysql/mysql.sock


# Disabling symbolic-links is recommended to prevent assorted securityrisks

symbolic-links=0


#log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


##by hua尾行添加

#设置密码策略及长度,mysql5.7默认安装并开启validate_password插件

#第一次初始化运行的时候要去掉,否则因mysql初始化生成不了密码而起不来

#validate_password_policy=0

#validate_password_length=4

#或者禁止validate_password

#validate_password=off


port = 3306

#id是唯一的,不能与主库的server_id相同,多个的从库的话也不能与其它从库相同

server_id =1


#设置默认字符集,也可以取消,取消则用安装时的默认字符集(不指定一般为latin1)

#用show variables like

'%char%';命令可以查看安装时的字符集是多少

default-storage-engine=INNODB

character-set-server=utf8

collation-server=utf8_general_ci

 

innodb_file_per_table=1

#同步一定要开启binlog

log-bin=/disk1/logs/mysql/mysql5.7/mysql-bin

 

log-queries-not-using-indexes=on

log-error=/disk1/logs/mysql/mysql5.7/error/error.log

#记录慢查询,为了节省性能没开

#slow-query-log = on

#long_query_time = 3

#slow_query_log_file=/disk1/logs/mysql/mysql5.7/slow/slowquery.log


2.3.启动mysql

#mysql启动、停止、重启

service mysqld start

service mysqld stop

service mysqld restart

#检查mysql状态、进程、端口号

service mysqld status

ps -ef |grep mysql

netstat -altnp|grep 3306

#设置开机启动

chkconfig mysqld on


如果启动不起来

方法一:删除原来目录数据,再次启动让其重启生成数据

systemctl stop mysqld.service

ps -ef |grep mysql

rm -rf /disk1/mysqlData

rm -rf /disk1/logs

mkdir -p

/disk1/logs/mysql/mysql5.7/error

mkdir -p

/disk1/logs/mysql/mysql5.7/slow

mkdir -p /disk1/mysqlData

chown mysql.mysql -R

/disk1/logs/mysql

chown mysql.mysql -R

/disk1/mysqlData

service mysqld start

service mysqld status

ps -ef |grep mysql

netstat -altnp|grep 3306

方法二:

如果还是解决不了,有可能selinux没关,请关闭selinux

方法三:

         按照上面的方法还是启动不起来,那么有可能是my.cnf没配置正确,或者相关目录没有授权,请仔细检查


2.4. 查看及修改mysql密码

#1)查看mysql初始密码

mysql5.7相对mysql5.6做了新的调整,密码并不是空密码,而是一个至少是8位的随机生成的密码,保存在错误日志中,通过查看/etc/my.cnf得知错误日志的路径我改为了“/disk1/logs/mysql/mysql5.7/error/error.log”,查看日志内容里面的密码

grep "password is" /disk1/logs/mysql/mysql5.7/error/error.log

#登陆测试:

mysql -uroot -p

#2)修改安全级别

第一次登陆mysql之后需要修改密码才能执行操作,否则会报如下错误:

mysql> show databases;

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

mysql5.7默认安装了validate_password安全插件,默认情况是不能少于8位,密码强度为中级,如果我们要修改为简单的(字母+数字、纯数字、纯字母),则会报如下错误:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

所以我们要要修改安全策略

#设置密码策略及长度

#length为什么要设置 4,因为不管你设置 1、2、3、4,最低长度都是4

set global validate_password_policy=0;

set global validate_password_length=4;

#在修改了mysql密码之后再次登陆才执行下面的命令,就可以看到策略改变了

SHOW VARIABLES LIKE 'validate_password%';

为了永久生效,已经添加到了my.cnf中,把注解去掉

validate_password_policy=0

validate_password_length=4

#重启mysql

service mysqld restart

#3)修改mysql密码

         在修改了密码策略及长度的前提下,就可以设置比较简单的密码了

#特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了

#下面的语句是把本地为root的账号密码修改为123456

ALTER USER 'root'@'localhost'IDENTIFIED BY '123456';

quit

#再次登陆,密码为123456

mysql -uroot -p

#随便执行一个查询试下

show databases;

quit

如果要添加用户则用:grant PRIVILEGES

#下面是授权hua用户密码为123456,给访问所有数据库的权限,

#客户端IP址址只能是192.168开头的

GRANT ALL PRIVILEGES ON*.* TO 'hua'@'%'IDENTIFIED BY '123456'WITHGRANT OPTION;

flush privileges;

也可以指定权限,下面语句,指定权权限给t1用户,密码为123456,数据库指定为gtlisten

客户端IP址址只能是192.168开头的

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, DROP, INDEX, ALTER, LOCK TABLES ONgtlisten.* TO't1'@'192.168.%.%' IDENTIFIED BY '123456' WITH GRANT OPTION;

flush privileges;


三、mysql 5.7 yum安装(从库)

         mysql从库安装和主库一样,只是配置不同而已,这里就不赘述。

3.1.安装前配置

#安装向centos6兼容的网络命令包

yum install -y net-tools

3.2.mysql安装(yum)

         因为版本过了段时间多少都会有一些漏洞,为了方便升级管理,现在采用yum方面安装

#1)安装mysql社会版数据库源并安装mysql,这里会自动找到mysql最新版本

rpm -ih http://repo.mysql.com/mysql57-community-release-el7.rpm

yum install -y mysql mysql-server mysql-devel

#2)建立相关目录

mkdir -p /disk1/logs/mysql/mysql5.7/error

mkdir -p /disk1/logs/mysql/mysql5.7/slow

mkdir -p /disk1/mysqlData

chown mysql.mysql -R /disk1/logs/mysql

chown mysql.mysql -R /disk1/mysqlData


#3)修改my.cnf配置

#先备份

cp /etc/my.cnf /etc/my.cnf.orig

#编辑配置文件并修改,黑色粗体部分为添加的,删除线部分修改过的,普通黑体是原有的

vi /etc/my.cnf

[client]

default-character-set=utf8

 

[mysql]

default-character-set=utf8

 

[mysqld]

#datadir=/var/lib/mysql

datadir=/disk1/mysqlData

socket=/var/lib/mysql/mysql.sock


# Disabling symbolic-links is

recommended to prevent assorted security risks

symbolic-links=0

#log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


##by hua尾行添加

#设置密码策略及长度,mysql5.7默认安装并开启validate_password插件

#第一次初始化运行的时候要去掉,否则因mysql初始化生成不了密码而起不来

#validate_password_policy=0

#validate_password_length=4

#或者禁止validate_password

#validate_password=off

 

port = 3306

#id是唯一的,不能与主库的server_id相同,多个的从库的话也不能与其它从库相同

server_id =11

#设置默认字符集,也可以取消,取消则用安装时的默认字符集(不指定一般为latin1)

#用show variables like

'%char%';命令可以查看安装时的字符集是多少

default-storage-engine=INNODB

character-set-server=utf8

collation-server=utf8_general_ci

 

innodb_file_per_table=1

#从库禁止log-bin

#log-bin=/disk1/logs/mysql/mysql5.7/mysql-bin

 

###########以下是开启slave的###############################

#不自动启动复制

#skip-slave-start=true

#启用中继日志

relay-log = relay-bin

##relay-log-index 可以不写用默认

relay-log-index = relay-bin.index

#可以设置只读,对个有supper权限的用户不生效,所以root可以写。

read-only = yes

 

#设置需要忽略同步数据库

#binlog-ignore-db=mysql,test

#设置需要同步的数据库或同步的表,如果多个库,每个库增加一行.

#binlog-do-db=skydb or name.table

################以上是开启slave的###########################

 

log-queries-not-using-indexes=on

log-error=/disk1/logs/mysql/mysql5.7/error/error.log

#因为是从库禁止记录慢查询,如果读写分离可以开启

#slow-query-log = on

#long_query_time = 3

#slow_query_log_file=/disk1/logs/mysql/mysql5.7/slow/slowquery.log

#4)启动mysql

systemctl start mysqld.service

#mysql停止命令

systemctl stop mysqld.service

#mysql重启命令

systemctl restart

mysqld.service

#设置开机启动

systemctl enable mysqld.service

#检查mysql是否启动

#查看mysql启动状态,绿色部分必须为active (running)

systemctl status mysqld.service

#查看进程及端口,如果进程和端口都存在也说明mysql运行正常

ps -ef |grep mysql

netstat -anltp|grep 3306


#5)启动不起来的处理方法

如果启动不起来

方法一:删除原来目录数据,再次启动让其重启生成数据

systemctl stop mysqld.service

ps -ef |grep mysql

rm -rf /disk1/mysqlData

rm -rf /disk1/logs

mkdir -p /disk1/logs/mysql/mysql5.7/error

mkdir -p /disk1/logs/mysql/mysql5.7/slow

mkdir -p /disk1/mysqlData

chown mysql.mysql -R /disk1/logs/mysql

chown mysql.mysql -R /disk1/mysqlData

systemctl start mysqld.service

systemctl status mysqld.service

方法二:

如果还是解决不了,有可能selinux没关,请看相关环节

方法三:

         按照上面的方法还是启动不起来,那么有可能是my.cnf没配置正确,或者相关目录没有授权,请仔细检查

3.3.查看及修改mysql密码

#1)查看mysql初始密码

grep "password is" /disk1/logs/mysql/mysql5.7/error/error.log

#2)修改安全级别

修改/etc/my.cnf,把配置文件中密码策略及长度注解去掉

validate_password_policy=0

validate_password_length=4

#重启mysql

systemctl restart

mysqld.service

#3)修改mysql密码

         在修改了密码策略及长度的前提下,就可以设置比较简单的密码了

#特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了

#下面的语句是把本地为root的账号密码修改为123456

ALTER USER 'root'@'localhost'IDENTIFIED BY '123456';

quit

#再次登陆,密码为123456

mysql -uroot -p


、设置mysql主从

4.1.主库(master)上操作

1)修改my.cnf(主库)

因为主mysql主从,主库需如果2个条件:

唯一的server_id

log-bin日志,因为从库是依赖这个日志同步的

以上均已配置

2)建立测试数据库

         为了测试随便建立一个hua的数据库,上面建立至少一张表,写一些数据

3)创建具有复制权限的用户(主库)

mysql -uroot -p

#输入密码,登陆,下面是授权repl用户只有同步权限,客户端只能是192.168.开头

GRANT REPLICATION SLAVE ON*.*TO'repl'@'192.168.%.%'IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

quit

4)锁定数据库并备份(主库)

为了防止主库写入,锁定全库的表,语句为FLUSH TABLES WITH READLOCK;

锁定表期间所有数据库只能读,不能写入!!

解锁的语句是unlock tables;


mysql -uroot -p

#输入密码,登陆,锁定全库的表

#注意,锁定表的时候show master status;值是不能变的,除非你解锁,如果变了就说明失败

#锁定表期间,ssh或执行锁定的mysql 客户端是不能关闭或者断开的,否则会锁定失败

#建议用mysql客户端工具执行锁定命令,这样会稳定一些

flush tables with read lock;

show master status;

show master status;

4)备份数据库

         打开另一个ssh,连接上主库服务器,然后执行备份命令

mysqldump -uroot -p -B hua >/disk1/backup/mysql/hua2170303.sql


2.从库(slave)上操作

1)修改my.cnf(主库)

         因为从库上的my.cnf在安装的时候已经配置好slave了,所以不需要做任何修改

2)还原主库备份到从库

开启mysql主从之后只能保证之后的数据库是一致的,所以为了保持之前的数据库一致性,得还原主库的备份到从库上。

把主库的备份的gtlisten2170302.sql复制到从库,可以使用,sz命令下载到本地然后上传到从库上,如果sz命令用不了则还没安装lrzsz,yum install -y lrzsz安装一下就OK了

#输入下面一条命令,会弹出一个对话框让你选择一个本地目录来保存文件

sz /disk1/backup/mysql/hua20170303.sql

也可以用rsync、scp命令同步过去,具体用法在这里不作解释,下面命令在主库执行

rsync -avz -P /disk1/backup/mysql/*  root@192.168.0.76:/disk1/tools/

scp -r /disk1/backup/mysql/*  root@192.168.0.76:/disk1/tools/


#还原数据库,我这里同步到了/disk1/tools目录下了

mysql -uroot -p</disk1/tools/hua20170303.sql

mysql -uroot -p -e "show databases;"

3)开启slave同步

         从库同步同步需要用到主库的bin日志中的bin名字及pos值(意思就是告诉你从那个地方起开始同步)

         从主库执行的show master status;得知bin文件名为“master-bin.000001”,pos值为154

#执行同步命令,注意下面命令是一条命令

CHANGEMASTER TO MASTER_HOST='192.168.0.75',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=154;

startslave;

#注意G后面是没有;号的

showslave status \G


4.3.主库(master)解锁(重要)

         配置好同步,并查看同步正常的情况下,就可以把mysql主库解锁了,回到主库的mysql界面执行,执行解锁命令unlock tables;

附一、常见操作

1. mysql主从复制跳过错误

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续

跳过错误有两种方式:

1.跳过指定数量的事务:

mysql>slave stop;

mysql>SET GLOBALSQL_SLAVE_SKIP_COUNTER = 1        #跳过一个事务

mysql>slave start


2.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误

vi /etc/my.cnf

[mysqld]

#slave-skip-errors=1062,1053,1146

#跳过指定error no类型的错误

#slave-skip-errors=all #跳过所有错误

2.常见其它命令

RESET MASTER #主机端运行,清除所有的日志,这条命令就是原来的FLUSH MASTER 

RESET SLAVE  #从机运行,清除日志同步位置标志,并重新生成master.info


3.从库重新设置新的同步

#1)停止slave

SLAVE STOP;

#2)重置slave,这个很重要,如果没重置的话,Slave_IO_Running起不来,也可以查看错误日志

RESET SLAVE;

#3)重新执行同步操作

1.主库锁定:show master

status;记录bin文件名及pos值

2.从库再次启动同步:

CHANGE MASTER TO

MASTER_HOST='mater端IP',MASTER_USER='账号',MASTER_PASSWORD='密码',MASTER_LOG_FILE='master-bin名字',MASTER_LOG_POS=pos值;

startslave;

#注意G后面是没有;号的

showslave status \G

3.同步成功后主库解锁


附二、模拟中出现的问题

1. 报错:Incorrect string value: '\xE6\x9D\x8E\xE5\x9B\x9B'

如果没有指定字符集的情况下随便建立一个表,在name字段写入汉字时报如下错误:

ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE5\x9B\x9B' for column 'name' at row 1

意思是说,name这个字段插入了一个不合法的值。

为什么插入中文就不合法了呢?

因为我们建表的时候,没有为name这个字段指定字符集,所以它默认采用的字符集是“latin1”。

打开Navicat for MySQL工具,在tb1表名上面单击鼠标右键选择“设计表”,选中“name”这一列,在下方就会显示该列对应的字符集:

在建表的时候我们当然可以为每一个字段指定字符集,如果没有指定的话,varchar类型的字段的默认字符集就是“latin1”。前面需要把它手动修改成“utf8”,才能插入中文。


不仅字段有默认的字符集,表也有默认的字符集,如果建表时没有为表指定字符集,表的默认字符集也是“latin1”,我们也要把表的字符集也手动修改为utf8:

永久解决方式:直接在my.cnf设置字符集

#编辑配置文件并修改,黑色粗体部分为添加的

vi /etc/my.cnf

[client]

default-character-set=utf8

 

[mysql]

default-character-set=utf8

 

[mysqld]

#设置默认字符集,也可以取消,取消则用安装时的默认字符集本例为latin1

default-storage-engine=INNODB

character-set-server=utf8

collation-server=utf8_general_ci

做上面的修改之后,再建立表字段就不会是latin1了,这样也不会报错

#重启mysql

systemctl restart

mysqld.service

#登陆mysql查看编码集

mysql -uroot -p -e "show variables like '%char%';"

#修改之前使用的字符集

#修改之后使用的字符集如下:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容