天天看点

MySQL 主从 个人理解MySQL主 从 简介

MySQL主 从 简介

mysql 主从这里指的是: mysql的主服务器和从服务器

为什么要有主从之分,mysql服务器是存放重要的数据的位置,用一台数据库来存放数据,若此数据库宕机了导致数据丢失了,严重的会直接影响业务,用户无法访问等问题,造成灾难性的后果,这之类问题都是安全隐患

还有个问题,业务量大了,访问量增大了、产生的数据多了,一台服务器读取的速度就会受到影响、这样的问题就需要增加备用的mysql服务器

主从的作用

  • 实时灾备:一台主数据库宕机了,启用从数据库,用于故障切换
  • 读写分离:主服务器可以只用于写操作,从服务器只用于读取,用于查询服务
  • 备份:这个问题可以很好的解决数据丢失的问题,避免影响业务

主从的形式

  • 一主多从 表示只有一台主服务器,多台从服务器
  • 主主复制 表示互为主服务器,同时也互为从服务器
  • 一主多从 ----扩展系统读取的性能,因为读是在从库读取的
  • 多主一从 ----5.7开始支持
  • 联级复制

主从复制原理

MySQL 主从 个人理解MySQL主 从 简介

用户将写入的数据保存到mysql主服务器(master)上,主库将所有写的操作记录到binlog 日志中,并且生成一个log dump的线程,将 binlog 日志传给从库的I/O线程,在从服务器(slave)上生成两个线程,一个I/O线程,一个SQL线程,I/O线程去请求主库的binlog,并将得到的binlog 日志写到relay log(中继日志)文件中,然后SQL线程,会读取relay log文件的日志,并解析成具体的操作,来实现主从的操作一致,达到最终数据一致的目的

主从复制配置的步骤:

1.确保从数据库与主数据库里的数据一样

2.在主数据库里创建一个同步账号授权给从数据库使用

3.配置主数据库(修改配置文件)

4.配置从数据库(修改配置文件)

需求:

搭建两台mysql 服务器,一台为主服务器,一台为从服务器,主服务器进行写操作,从服务器进行读操作

环境说明:

数据库角色 IP 应用 版本
主数据库(master) 192.168.169.20 CentOS7/redhat7 mysql-5.7
从数据库(slave) 192.168.169.30 CentOS7/redhat7 mysql-5.7

mysql的安装

分别在主从上安装mysql-5.7 版本,此处略过安装步骤,可以参考 lnmp 或者 lnmt 里面安装mysql 的步骤

Mysql 主从的配置

全备主库,全备主库时需要另开一台终端给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致

mysql> flush tables with read lock;   //此表的终端必须备份完了之后才能退出,退出即为解锁
Query OK, 0 rows affected (0.00 sec)   
[[email protected] ~]# mysqldump -uroot -pchen --all-databases > /opt/all-20180907.sql
[[email protected] opt]# ls
all-20180907.sql  data
[[email protected] opt]# scp all-20180907.sql [email protected]:/opt/
[email protected]'s password: 
all-20180907.sql                               100%  782KB  12.2MB/s   00:00   
           

解锁主库的锁定状态,直接退出即可

mysql> quit
Bye
           

在从库上恢复主库的备份,确保与主库一致

[[email protected] ~]# mysql -uroot -pchen < /opt/all-20180907.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
           

在主数据库里创建一个同步账号授权给从数据库使用

mysql> create user 'chen'@'192.168.169.30' identified by 'chen';     //创建一个账号指定在从服务器上登录
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'chen'@'192.168.169.30';     //对这个账号做授权处理
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
           

配置主数据库

[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data/
socket = /tmp/mysql.sock
port = 3306
pid-file = /tmp/data/mysql.pid
user = mysql
skip-name-resolve
log-bin = mysql-bin    //启用binlog日志
server-id = 1		//数据库服务器唯一表示符,主库的server-id值必须比从库大
symbolic-links=0
log-error=/var/log/mysqld.log
           

重新启动 mysql 服务

[[email protected] ~]# service mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
           

查看数据库的状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
           

配置从数据库

[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data/
socket = /tmp/mysql.sock
port = 3306
pid-file = /tmp/data/mysql.pid
user = mysql
skip-name-resolve
server-id = 2       //设置从库的唯一标识符,从库的server-id值必须小于主库的该值
relay-log = mysql-relay-bin   //启用中继日志relay-log
symbolic-links=0
log-error=/var/log/mysqld.log
           

重启从库的mysql服务

[[email protected] ~]# service mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
           

配置并启动主从复制

mysql> change master to master_host='192.168.169.20',master_user='chen',master_password='chen',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.07 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
           

查看从服务器的状态

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.169.20
                  Master_User: chen
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes       //从服务器上产生的线程,必须是yes
            Slave_SQL_Running: Yes       //从服务器上产生的线程,必须是yes 
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 527
.... 以下省略
           

测试验证

在主服务器上插入一张新表,并写入数据

mysql> create database chens;
Query OK, 1 row affected (0.00 sec)

mysql> use chens;
Database changed

mysql> create table  cs(id int not null,name varchar(100)not null,age tinyint);
Query OK, 0 rows affected (0.03 sec)

mysql> insert cs (id,name,age)values(1,'tom',10),(2,'jack',30);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from cs;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
|  2 | jack |   30 |
+----+------+------+
2 rows in set (0.00 sec)
           

在从数据库中查看是否同步

[[email protected] ~]# mysql -uroot -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| chens              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use chens;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------+
| Tables_in_chens |
+-----------------+
| cs              |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from cs;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
|  2 | jack |   30 |
+----+------+------+
2 rows in set (0.00 sec)
           

同步成功!

msyql 的 备份与恢复

[[email protected] opt]# mysqldump -uchenshuo -pchen wordpress > /opt/wordpress.sql   //备份数据到/opt/ 下面叫wordpress.sql
[[email protected] opt]# ls
data  wordpress  wordpress.sql
           

数据的恢复

进入到数据库创建一个数据库wordpress

[[email protected] opt]# mysql -uchenshuo -p  wordpress < /opt/wordpress.sql         
Enter password: 
           

继续阅读