MySQL 主从配置

主服务器 192.168.1.130
从服务器 192.168.1.99
 
 
 

主从同步只能基于搭建好之后的数据操作的同步,无法同步以前的数据,故需要手动同步

mysqldump手动复制
切换到mysql/bin目录下,执行以下命令:
# 导出db_user数据库
./mysqldump -uroot -p --databases 数据库名 > 导出的包名.sql

#导出db1库a1和a2表
mysqldump -uroot -proot --databases db1 --tables a1 a2  >/tmp/db1.sql

# 复制到另外一台机器, 并输入对应的密码
scp 导出包.sql '用户名'@IP地址:复制到的文件夹

# 登陆从服务器,导入数据库
mysql -uroot -p < 导出的包.sql

或者可以登录MySQL后使用 source 导出的包.sql

导出之后配置my.cnf(主服务器)

vim /etc/my.cnf
# 修改/etc/my.cnf如下:
server-id = 1       #server-id 服务器唯一标识。
log_bin = mysql-bin     #log_bin 主服务器的mysql二进制日志,提供给从服务器用于同步数据。只用需要同步的数据库的操作才会记录在日志里。

#以下二选一:
#binlog_do_db 指定同步的数据库名
#binlog_ignore_db 指定不同步的数据库名
binlog_do_db = 同步的数据库名

# binlog记录内容的方式,记录被操作的每一行
 binlog_format = ROW
 # 减少记录日志的内容,只记录受影响的列
 binlog_row_image = minimal
[mysql]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character_set_server=utf8

lower_case_table_names=1    #设定数据库不区分大小写
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
log-error = /usr/local/mysql/data/localhost.err
pid-file = /usr/local/mysql/data/localhost.pid

# character config
 character_set_server = utf8mb4
 symbolic-links = 0
 explicit_defaults_for_timestamp = true
 sql-mode = NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
 innodb_flush_log_at_trx_commit = 1
配置完后重启服务器
 
[root@localhost bin]# service mysql restart
Shutting down MySQL........... SUCCESS! 
Starting MySQL................. SUCCESS! 
[root@localhost bin]# mysql -uroot -p
Enter password:  输入密码
mysql> grant replication slave on *.* to cs@192.168.1.99 identified by 'Admin@123456'; #只允许1.99 使用cs这个账号连接
Query OK, 0 rows affected, 1 warning (0.00 sec)

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

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |    447306| 备份数据库名   |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 从服务器配置

[root@localhost mysql]# vim /etc/my.cnf

  1 [mysqld]
  2 init-connect='SET NAMES utf8mb4'
  3 character-set-server=utf8mb4
  4 bind-address=0.0.0.0
  5 port=3306
  6 user=mysql
  7 basedir=/usr/local/mysql
  8 datadir=/usr/local/mysql/data
  9 socket=/tmp/mysql.sock
 10 log-error=/usr/local/mysql/data/mysql.err
 11 pid-file=/usr/local/mysql/data/mysql.pid
 12 #character config
 13 character_set_server=utf8mb4
 14 symbolic-links=0
 15 explicit_defaults_for_timestamp=true
 16 lower_case_table_names=1
 17 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
 18 
 19 server-id = 2
 20 log_bin = mysql-bin
 21 binlog_do_db = zzjd
 22 binlog_format = ROW
 23 binlog_row_image = minimal
 24 lower_case_table_names=1
 25 #跳过错误
 26 slave-skip-errors =1062,1032,1060
温馨提示:
当只针对某些库的某张表进行同步时,如下,只同步liting库的haha表和test库的heihei表:
replicate-do-db = liting
replicate-wild-do-table = liting.haha //当只同步几个或少数表时,可以这样设置。注意这要跟上面的库指定配合使用;
replicate-do-db = test
replicate-wild-do-table = test.heihei //如果同步的库的表比较多时,就不能这样一一指定了,就把这个选项配置去掉,直接根据指定的库进行同步。
 

重启从服务器

 
[root@localhost data]# service mysql restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL.. SUCCESS! 
[root@localhost data]# mysql -uroot -p
mysql> change master to master_host='192.168.1.130',master_port=3306,master_user='cs',master_password='Admin@123456',master_log_file='mysql-bin.000004',master_log_pos= 447306;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.130
                  Master_User: cs
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 447306
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 10872
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes  #####
            Slave_SQL_Running: Yes  #这俩个值必须为YES才能进行主从复制

#master_host 【主服务器的IP地址】
#master_port 【主服务器的端口】
#master_log_file 【show master status显示的File列:mysql-bin.000004】
#master_log_pos 【show master status显示的Position列:447306】
Query OK, 0 rows affected, 2 warnings (0.02 sec)

 

测试主从服务器工作情况

主服务器IP地址:192.168.1.130
从服务器IP地址:192.168.1.99
测试:在主服务器上创建表,并插入数据。看从服务器是否会进行同步。
①主服务器上建数据
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` varchar(10) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'abong');
INSERT INTO `user` VALUES ('2', 'zhang');

②检验从服务器是否同步。在从服务器上已经有了user表,并且数据也是正确的。
 

 

 

 

 

 

posted @ 2022-09-08 13:45  聆听说书人  阅读(70)  评论(0编辑  收藏  举报