MySQL主从复制

##命令集

#主库
vim /data/3306/my.cnf
    server-id = 1
    log-bin=/data/3306/data/mysql-bin
/data/3306/mysql restart
mysql -uroot -p123123 -S /data/3306/mysql.sock
    show variables like 'server_id';
    show variables like 'log_bin';
    grant replication slave on *.* to 'yunjisuan'@'192.168.200.%' identified by '123123';

    flush table with read lock;
mysqldump -uroot -p123123 -S /data/3306/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
    unlock tables;
 
#从库
vim /data/3307/my.cnf
    server-id = 3
    relay-log = /data/3307/data/relay-bin
/data/3307/mysql restart
mysql -uroot -p123123 -S /data/3307/mysql.sock
    show variables like 'server_id';
    show variables like 'log_bin';
    CHANGE MASTER TO MASTER_HOST='192.168.200.123',MASTER_PORT=3306,MASTER_USER='yunjisuan',MASTER_PASSWORD='123123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=533;
mysql -uroot -p123123 -S /data/3307/mysql.sock -e "start slave"
mysql -uroot -p123123 -S /data/3307/mysql.sock -e "show slave status\G" |egrep "IO_Running|SQL_Running|Seconds_Behind_Master"

命令详解

#master服务器
#修改配置文件
vim /data/3306/my.cnf
server-id = 1
log-bin=/data/3306/data/mysql-bin
#重启配置文件
/data/3306/mysql restart
#登陆账号
mysql -uroot -p123123 -S /data/3306/mysql.sock
#里面查看MySQL的系统变量
show variables like 'server_id';
  server_id  1  #则成功
show variables like 'log_bin';
log_bin   OK    #则成功
#mysql里面输入命令创建主从复制账号,IP是从库的Ip,而且不能是范围
grant replication slave on *.* to 'yunjisuan'@'192.168.200.135' identified by '123123';
#刷新权限
flush privileges;
#检查账号
select user,host form mysql.user;

##主库备份
#实现对主库数据表只读,锁表(此窗口不能关,可以新建窗口执行下面操作)
flush table with read lock;
#查看锁表时间参数
show variables like '%timeout%';
#查看主库现在二进制文件内容记录标识位置
show master status;
#温备份
mysqldump -uroot -p123123 -S /data/3306/mysql.sock --events -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
#解锁主库
unlock tables;


#slave服务器
vim /data/3307/my.cnf
server-id = 3
relay-log = /data/3307/data/relay-bin
/data/3307/mysql restart
#登陆
mysql -uroot -p123123 -S /data/3307/mysql.sock
#查看mysql的系统变量
show variables like 'log_bin';
show variables like 'server_id';

#把主库的备份同步到从库来,使他们数据一致
cd /server/backup
gzip -d mysql_bak.2017-07-21.sql.gz
mysql -uroot -p123123 -S /data/3307/mysql.sock < mysql_bak.2017-07-21.sql

#登陆从库
mysql -uroot -p123123 -S /data/3307/mysql.sock 
#然后输入命令
CHANGE MASTER TO
MASTER_HOST='192.168.200.123'      # 这是主库IP
MASTER_PORT=3306                   # 主库端口,从库端口可以和主库不同
MASTER_USER='yunjisuan'            # 这是主库上建立的用户复制的用户yunjisuan
MASTER_PASSWORD='123123'           # 这是yunjisuan的密码
MASTER-LOG_FILE='mysql-bin.000001' # show master status 二进制文件名称,不能多空格
MASTER_LOG_POS=533                 # show master status 二进制文件记录位置,不能多空格
#查看从库新的master.info文件
ll /data/3307/data/master.info
cat /data/3307/data/master.info
#启动主从复制开关
mysql -uroot -p123123 -S /data/3307/mysql.sock -e "start slave"
#查看状态(\G是竖形显示)
mysql -uroot -p12323 -S /data/3307/mysql.sock -e "show slave status\G"
#查看状态最重要的三项
mysql -uroot -p123123 -S /data/3307/mysql.sock -e "show slave status\G" |egrep "IO_Running|SQL_Running|Seconds_Behind_Master"
#在测试就行了

#查看主库从库线程状态
show processlist\G
#跳针
stop slave;
set global sql_slave_skip_counter=1;
start slave;

##从库想成为主库时,my.cnf中(双主,级联)
#增加参数
log-slave-updates
log-bin=/data/3307/mysql-bin
#自动清除7天binlog日志,增加参数
#相当于find /data/3307/ -type f -name "mysql-bin.000*" -mtime +7 |xargs rm -f
exipire_logs_days = 7

企业备份

中小企业全量备份

推送:数据库定时任务备份后,rsync推送到备份服务器上
raid:在MySQL服务器上,额外的进行组raid挂载,将备份在此挂载目录里(节约成本)

中大型和大型企业(全备和增备)

每周一全备,每天一增备

增备

1:定时任务+增备切割==》每天0点flush logs 切割二进制日志
2:定时同步,每周日全备份,并进行一次flush logs,然后删除之前备份,最后最实

##主从复制
常用架构:主从同步,主从复制。主从复制加读写分离,写(20%的压力)给主,主实时同步给从(读80%)
架构类似于NFS,但主只能是一个,从可以多个,主只能写,并且不能有脚本,定时任务,等给主增加 压力的任务
类型:一主一从,一主多从,互为主从,主从级联,环绕多主。
实现:必须打开master端的binlog记录功能
过程:slave从master中回去binlog日志,然后再自己的slave端以相同顺序执行此binlog日志
打开:打开binlog,在master端配置文件mysql模块中,增加“log-bin”参数来实现
log-bin=/data/3306/mysql-bin
###原理:
异步复制,以master复制到slave
由三个线程完成,两个线程(I/O,SQL)在slave端,一个线程(I/O)在master端

原理分析: 主有一个MySQL主进程,一个I/O线程,从库有一个主进程,一个I/O线程,一个SQL线程。
用户向主库data里输入数据,主库主进程由于已经打开了bin-log日志,数据会被I/O线程记录在
binlog二进制日志里(mysql-bin.index)
1: 打开binlog日志
2: 创建主从复制账号
3: server id = 1 (主必须是1)
当从想复制时,自己生成I/O线程,主动向主发起验证,从的I/O线程自发的监看主的
mysql-bin.indnx日志,当住的日志更新时,从库主动发起验证,验证通过后,主的I/O线程
会把文件复制反馈给从的I/O线程,复制过来的数据放在中继日志中(relay-log=relay-bin)
从的SQL线程监看中继日志,发现更新,会把二进制语言翻译成SQL语言,记录在从库中。
1:开启中继日志 relay-log=relay-bin
2:主从复制验证信息录入
3:激活主从复制
4:server id = 2 (只要不是1,就行)

验证: 验证信息是什么?
1:主库IP 端口port
2:主库的复制账号和密码
3:复制哪个二进制文件的名字
4:二进制文件中的position具体位置
分析: 从库如何知道自己应该从哪个位置开始复制,从哪个文件开始复制?
需要有个记录文件,来记这些,I/O线程,记录文件:master.info
SQL线程也需要有个记录,为了把数据写入数据库,记录文件:relay-log.info
过程: 1:从库I/O线程找主库I/O线程申请验证,并把想要的,从哪开始复制的信息找到
2:主I/O线程把自己日志文件需要的binlog日志复制出来
3:主I/O线程把新的binlog日志和新的position位置和名字,发给从I/O线程
4:从I/O线程把位置名字记录在master.info中
5:SQL把新的信息更新到relay-log.info中
6:SQL写入数据库

主从复制故障处理

交互: 1)stop slave;
       2)drop database 库名;(因为出现错错误的是创建了库,所以删除他)
       3) start slave;
非交互 1)stop slave;
       2)set gloval sql_slave_skip_counter=1;(跳过1次,多次不同步,可以多次执行)
       3)start slave;

主从复制延迟,及解决方法

     1)      从库太多
    解决:       减少从库,3-5个最好
     2)      从库硬件比主库差
    解决:       提高从库硬件配置
     3)      慢SQL语句太多
    解决:       通过慢查询日志,找到慢SQL语句,去找开发人员做优化 
     4)      主从复制设计问题
    解决:        升级MySQL版本到5.6以上 
     5)      主从库之间的网络延迟
    解决:        提高宽带网速,
     6)      读库读写压力大
    解决:        提高主库硬件,并且架构前端加buffer及缓存层

加库以及备份

假如MySQL的binlog日志把系统盘空间占满了,你如何在不影响数据安全的情况下解决这个问题?
1)先临时锁表, flush table with read lock; 此命令不能关闭,关闭后临时锁表失效。
2) 再复制另一个ssh通道
3)再做全备份, mysqldump -uroot -p123123 --databases 所有的库名 > /backup/库名_$(date +%F).sql;
4)删除所有日志 find /usr/local/mysql/data/ -type f -name “mysql-bin.[0-9]+” |xargs rm- rf
5)刷新日志 flush logs;
6) 解锁 unlock tables;

如何授权读写账号

一个账号,分别在主库写,从库读,设置不同的权限,但是当宕机时,需要从库的备份做恢复,这时在主库恢复时,执行的用户时从库的,权限不一样,很麻烦。我们备份时 mysqldump 命令有个参数,可以备份同时不备份用户所属

一个账号,并且主库从库权限一样,所以我们需要改从库的表权限,设置为read only 只读权限。
1) killall mysqld 或 mysqladmin -uroot -p12123 -S /data/3307/mysql.sock shutdown
(临时设置) mysql_safe --defaults-flie=/data/3307/my.cnf --read-only
2)vim /etc/my.cnf (添加只读参数)
[mysql]
read-only

备份与恢复

全备与恢复
  完全备份:备份与恢复操作简单
      冷备份 : tar /usr/local/mysql/data 或 /var/lib/mysql
      热备份 : mysqldump -uroot -p123213 库名 > /backup/库名_$(date +%F_%w).sql
            多库:--databases 库名 库名
            所有库:--all-databases
            对库里的表备份 
                mysqldump -uroot -p123213 库名 表名 > /backup/库名_$(date +%F_%w).sql
            对结构备份
                -d 库名 表名
      
  恢复:
      交互:  source /backup/文件名
      非交互:mysql -uroot -p123123 < /backup/文件名
      
      
增备与恢复: 通过mysqlbinlog备份,日志存在于data里的 mysql-bin.* (起始于mysql-bin.000001)
   开启 vim /etc/my.cnf
       51 log-bin=mysql-bin              #开启二进制文件
       52 max_binlog_size=10240000       #二进制默认最大1M,到最大后,自动切割
   
   读取二进制文件  mysqlbinlog mysql-bin.000001
   刷新(切割新日志) flush logs;
   

恢复:
   一般恢复:mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p123123
   以时间点恢复:
      以二进制文件开始写到这个时间点结束
         mysqlbinlog --stop-datetime='年月日时分秒' 二进制文件 |mysql -u -p
      以这个时间点开始写到二进制文件结束
         mysqlbinlog --start-datetime='年月日时分秒' 二进制文件 |mysql -u -p 
      以这个时间点开始写到这个时间点结束
         mysqlbinlog --start-datetime='年月日时分秒' --stop-datetime='年月日时分秒'  |mysql -u -p
         
    以位置点恢复: 
     查看二进制文件位置记录(id)
      show master status;
        以二进制文件开始写到这个位置结束
           mysqlbinlog --stop-position='id' 二进制文件 |mysql -u -p
        以这个位置开始写到二进制文件结束  
           mysqlbinlog --start-position='id' 二进制文件 |mysql -u -p 
        以这个位置点开始写到这个位置结束
           mysqlbinlog --start-position='id' --stop-position='id'  |mysql -u -p  
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值