一 安装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
从:
mysql> create database testdb;
[root@localhost ~]# cd /usr/local/mysql [root@localhost mysql]# scp root@192.168.128.133:/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:
#vi /etc/my.cnf
[mysqld]
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 statusG
*************************** 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 ) 指让从跳过多少个事件。 因为之前有事件执行失败。