一 安装MYSQL
下载mysql-5.5.52-linux2.6-x86_64.tar.gz到/usr/local/src/
cd /usr/local/src/
tar zxvf mysql-5.5.52-linux2.6-x86_64.tar.gz
[root@localhost src]# mv mysql-5.5.52-linux2.6-x86_64 /usr/local/mysql
[root@localhost src]# useradd -s /sbin/nologin mysql
[root@localhost src]# cd /usr/local/mysql
[root@localhost mysql]# mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
Installing MySQL system tables...
[root@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@localhost mysql]# vim /etc/my.cnf
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# vim /etc/init.d/mysqld
[root@localhost mysql]# /etc/init.d/mysqld start
[root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot
主用户名: root 密码 mroot 192.168.128.133
从用户名:root 密码 sroot 192.168.128.134
主从同步的用户名 repl 密码 123456
配置命令后 /usr/local/mysql/bin/mysql 直接用 mysql 命令
[root@localhost ~]# PATH=$PATH:/usr/local/mysql/bin
[root@localhost ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost ~]# source /etc/profile
主从上都创建数据库 testdb:
主:
mysql> create database testdb;
主导数据给testdb,先导出到123.sql 再将 123.sql导入给testdb;
[root@localhost mysql]# /usr/local/mysql/bin/mysqldump -uroot mysql > 123.sql
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
[root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot testdb < 123.sql
从:
[root@localhost ~]# cd /usr/local/mysql
[root@localhost mysql]# scp [email protected]:/usr/local/mysql/123.sql /usr/local/mysql/
[root@localhost mysql]# mysql -uroot -psroot
[root@localhost mysql]# mysql -uroot -psroot testdb < 123.sql
二
1、主从服务器分别作以下操作:
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码
主: mysqladmin -uroot password 'mroot'
从: mysqladmin -uroot password 'sroot'
一、 修改主服务器master:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
除了这两行是必须的外,还有两个参数,你可以选择性的使用:
binlog-do-db=testdb
binlog-ignore-db=databasename1,databasename2
binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以啦。
二、 修改从服务器slave:
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
找到 “server-id = 1” 这一行,改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。
另外在从上,选择性的增加如下其中一行,对应于主上增加的那行:
replicate-do-db=testdb
replicate-ignore-db=databasename1,databasename2
三、 /etc/init.d/mysql restart
四、主服务器:
[root@localhost mysql]# mysql -uroot -pmroot
mysql> grant replication slave on *.* to 'repl'@'192.168.128.134' identified by '123456';
mysql> flush tables with read lock; 先锁定主数据库
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 401 | testdb | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> unlock tables; // 去从那配完再解锁
Query OK, 0 rows affected (0.00 sec)
[root@localhost mysql]# iptables -F //主服务器要关闭防火墙,要不然从会 Slave_IO_Running: Connecting
五、从服务器:
[root@localhost mysql]# mysql -uroot -psroot
mysql> change master to master_host='192.168.128.133',
-> master_user='repl',master_password='123456', //与上面的grant replication对应。
-> master_log_file='mysql-bin.000004',master_log_pos=401;
六、 mysql> unlock tables; //主那解锁
七、从服务器 开启方从服制
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.128.133
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 401
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes // 这里要yes 主服务器要关闭防火墙 iptables -F
Slave_SQL_Running: Yes // 这里要yes
Replicate_Do_DB: testdb
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: 401
Relay_Log_Space: 413
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
测试同步: 清空主数据库testdb 里的表 db
[root@localhost mysql]# mysql -uroot -pmroot
mysql> use testdb;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> truncate table db;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
此时进从服务器 查看 db 应该为0
[root@localhost mysql]# mysql -uroot -psroot
mysql> use testdb;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
遇见问题:
导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:1、网络不通 2、密码不对 3、pos不对 4、 server-id
发现服务器本地没有监听 3306 : netstat -an | grep 3306 注掉 skip-networking 就可以了。
当主重启MYSQL 后 发现从Slave_SQL_Running: No
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=N; (N=1 或大于 1 ) 指让从跳过多少个事件。 因为之前有事件执行失败。