vlambda博客
学习文章列表

mysql集群的主从复制

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!



mysql数据库安装


如果你的服务器使用rpm安装了mysql的话需要先卸载。
找度娘(linux 卸载mysql rpm)即可。
https://www.cnblogs.com/xiaxiaoxu/p/9979022.html
安装mysql:
介绍:glibc是mysql官方编译好了的安装包,直接安装就行。

1. 解压及创建目录

a)移动压缩包到/usr/local/目录下(很多公司将第三方软件安装在此目录下):
  
    
    
  
[root@node1 local] # mv /root/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz /usr/local/
b)进入/usr/local/目录下解压缩:
  
    
    
  
[root@hadoop1 local]# tar  -zxvf  mysql-5 .7 .28-linux-glibc2 .12-x86_64 .tar .gz
c)改名:
  
    
    
  
[root@hadoop1 local]# mv  mysql-5 .7 .28-linux-glibc2 .12-x86_64  mysql
d)进入mysql目录,再去创建3个目录:
  
    
    
  
[root@hadoop1 local] # cd mysql
[root@hadoop1 mysql] # mkdir arch tmp relay_log
备注:arch(记录的是binlog日志信息)tmp(临时目录) relay_log(用来做主从同步)。

2. 创建用户及用户组

1)创建用户组bda:
  
    
    
  
[root@hadoop1 local] # groupadd -g 101 dba
2)查看有没有创建此用户组,需要查看一个文件/etc/group,看一下有没有dba。
  
    
    
  
[root@hadoop1 mysql]# cat / etc/ group | tail  -n  3
postfix :x :89:
ntp :x :38:
dba :x :101:
3)创建mysql用户,指定用户组是bda,指定mysql用户的家目录是:
  
    
    
  
/usr/ local/mysql/
[root@hadoop1 local] # useradd -g dba -d /usr/local/mysql/ mysql
备注: -g<群组>  指定用户所属的群组。 -d<登入目录>  指定用户登入时的起始目录(用户的家目录)。
4)为了解决-bash-4.2$问题(原因就是因为mysql用户的家目录下没有以.bash开头的隐藏文件),需要注意的是,复制操作需要root用户执行。
  
    
    
  
[root@hadoop1 local] # cp /etc/skel/.bash_profile /usr/local/mysql/
[root@hadoop1 local] # cp /etc/skel/.bash_logout /usr/local/mysql/
[root@hadoop1 local] # cp /etc/skel/.bashrc /usr/local/mysql/

3. 配置mysql用户环境变量(注意使用root用户)

在.bash_profile 中末尾添加两行:
  
    
    
  
[mysql@hadoop1 ~]$ vi /usr/ local/mysql/.bash_profile
#mysql
export MYSQL=/usr/ local/mysql
export PATH= $PATH: $MYSQL/bin

4. 创建mysql的配置文件my.cnf(如果出现覆盖overwrite,输入y)

  
    
    
  
上传my. cnf
[root@hadoop1 ~]# mv my. cnf /etc/
5. 赋予权限
  
    
    
  
[root@hadoop1 ~] # chown mysql:dba /etc/my.cnf
[root@hadoop1 ~] # chmod 640 /etc/my.cnf
[root@hadoop1 ~] # chown -R mysql:dba /usr/local/mysql/
[root@hadoop1 ~] # chmod -R 755 /usr/local/mysql/

6. 配置开机自动启动

  
    
    
  
[root@hadoop1 ~] # cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
[root@hadoop1 ~] # chmod +x /etc/rc.d/init.d/mysql
[root@hadoop1 ~] # chkconfig --add mysql
[root@hadoop1 ~] # chkconfig mysql on

7. 安装libaio包

  
    
    
  
[root@hadoop1 ~] # yum -y install libaio

8. 初始化mysql

  
    
    
  
[root@hadoop1 ~] # su - mysql

# data是mysql数据库存放数据的目录
[mysql@hadoop1 ~]$ mkdir data
#初始化mysql
[mysql@hadoop1 mysql]$ bin/mysqld --defaults-file= /etc/my.cnf --user=mysql --basedir= /usr/local /mysql --datadir=/usr /local/mysql /data --initialize

9. 查看临时密码有没有生成

  
    
    
  
[mysql@hadoop1 data]$ cat /usr/local/mysql/data/ hostname.err | grep password
备注:MySQl启动日志是hostname.err,初始化完如果发现没有临时密码,需要cat一下这个日志文件,看一下有没有ERRO,如果有erro重新初始化mysql。

10. 启动mysql服务

  
    
    
  
[mysql@hadoop1 data]$ /usr/local/mysql/bin/mysqld_safe --defaults-file= /etc/my.cnf &
[mysql@hadoop1 data]$ service mysql status
#也可以去看一下mysql的进程在不在
[mysql@hadoop1 data]$ ps -elf | grep mysql (会发现mysql进程正在启动)

11. 修改临时密码

  
    
    
  
需要进入mysql
mysql -uroot -p
mysql> alter user root@localhost identified by '123456';
mysql> grant all privileges on *.* to 'root'@ '%'  identified by '123456';
mysql> flush privileges;

12. 验证连接工具能够连接

重新初始化mysql数据库步骤:
1)[root@hadoop1 local]# su - mysql
2)[mysql@hadoop1 ~]$ rm -rf data arch tmp relay_log
3)[mysql@hadoop1 ~]$ mkdir data arch tmp relay_log
4)看一下有没有mysql进程正在运行。
  
    
    
  
[mysql@hadoop1 mysql]$ ps -elf | grep mysql
[mysql@hadoop1 mysql]$ kill - 9 [PID]
5)再从第8步开始执行。
13. 有可能遇到的问题
1)mysql再次进进不去了?
  • 检查你的密码对不对;

  • 检查你的mysql有没有启动,需要重新启动,而且需要再添加开机自动启动。

  
    
    
  
[mysql@hadoop1 ~]$ service mysql status
SUCCESS! MySQL running ( 7661)
  • 如果是success没有问题。

  
    
    
  
[mysql@hadoop1 ~]$ ps -elf | grep mysql
  • 看一下有没有这个进程。

2)mysql命令没有找到。
问题:mysql:command not found。
解决:配置相关用户环境变量。



mysql数据备份


https://www.cnblogs.com/markLogZhu/p/11398028.html
写一个脚本一次性备份所有库下面的所有表。
1. 核心命令:
  
    
    
  
mysqldump -uroot -p123456 test user > user.sql
2. 需要拿到所有的数据库:
  
    
    
  
[mysql@hadoop1 mysql]$ mysql -uroot -p123456 -s - e  "show databases;" | grep -v Database
mysq l: [Warning] Using a password on the command  line interface can be insecure.
information_schema
mysql
performance_schema
sys
test
test2
备注:
-s :将结果以文本的方式进行输出;
-e :可以使用非交互方式传入sql语句并执行将结果返回到控制台,在脚本常用。
3. 需要拿到所有的表:
  
    
    
  
[mysql@hadoop1 mysql]$ mysql -uroot -p123456 -s - e  "use test;show tables;" | grep -v Tables_in
mysq l: [Warning] Using a password on the command  line interface can be insecure.
user
4. 待优化的脚本:
5. 优化之后的脚本:
mysql集群的主从复制



mysql集群架构


1. mysql binlog日志:
https://zhuanlan.zhihu.com/p/52455547 https://blog.csdn.net/weixin_33893111/article/details/113424335 https://www.cnblogs.com/clsn/p/8150036.html
binlog即binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作(记录数据库中所有的修改操作)。
通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。
2. 二进制日志模式:
1)STATMENT模式:
基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中。
优点: 不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
缺点: 数据记录的不详细。
2)基于行的复制(row-based replication, RBR,公司基本都会采用这种模式):
不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。
优点: 不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。并且记录的很详细。
缺点: 会产生大量的日志,尤其是alter table的时候会让日志暴涨。
解决: 会设置日志的过期时间expire_logs_days = 7。
3)混合模式复制(mixed-based replication, MBR):
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
  • 开启binlog日志需要在配置文件中添加:

    server-id;
    log-bin : 指定binlog日志存放的位置;
    log-format :采用什么模式用存放binlog。
  • 查看binlog日志文件的命令:

  
    
    
  
[mysql@hadoop1 arch]$ mysqlbinlog -- no-defaults --base64-output=decode-rows -vvv mysql-bin .000003
3. 主从复制:
mysql集群的主从复制
4. 开启主从同步的步骤:
1)主库开启binlog日志,并且需要保证主从库的server-id不一致,如果一旦修改了server-id(需要修改的是my.cnf),需要重启mysql数据库。
  
    
    
  
[mysql@hadoop2 relay_log]$ exit
logout
[root@hadoop2 ~] # service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
2) 在主库中执行,创建用于主从复制的mysql 用户,并且赋予可以拿到binlog日志的日志权限。

创建用户:

  
    
    
  
mysql> create user 'reproduce'@ 'localhost' identified by '123456';
Query OK, 0 rows affected (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

验证:

mysql集群的主从复制

远程访问:

mysql集群的主从复制

加权限(在主库使用root用户):

  
    
    
  
mysql> grant replication slave on *.* to 'reproduce'@ '%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>
 flush privileges;
Query OK, 0 rows affected (0.01 sec)

验证:

mysql集群的主从复制
3)需要在从库中执行
需要在主库中查看最新的binlog日志文件名和最新的记录点:
mysql集群的主从复制
在从库中执行(用root用户执行,需要改成你的主库的binlog名称和记录点):
  
    
    
  
change  master  to
master_host= '192.168.174.10',
master_port= 3306,
master_user= 'reproduce',
master_password= '123456',
master_log_file= 'mysql-bin.000002',
master_log_pos= 1680;
需要开启丛库的两个线程:
  
    
    
  
IO_thread
SQL_thread
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
4)验证
查看两个线程的状态:
  
    
    
  
mysql> show slave status\G
Slave_IO_Runnin g: Yes
Slave_SQL_Runnin g: Yes
在主库中创建库和表,在从库中是能同步的, 并且看中继日志,也是同步的:
  
    
    
  
[mysql@hadoop2 relay_log]$ mysqlbinlog -- no-defaults --base64-output=decode-rows -vvv relay- log. 000002
如果不是双yes,需要停两个线程并重新指定:
mysql> stop slave;
重新指定:
mysql> start slave。

mysql集群的主从复制

本文作者:郑平安

本文来源:IT那活儿(上海新炬王翦团队)