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表,并且数据也是正确的。