目录
pt-table-checksum 和 pt-table-sync. 12
环境
主机: master操作系统:centos 6.8 64位
IP:192.168.0.1
MySQL版本:5.7.23
从机: slave操作系统:centos 6.8 64位
IP:192.168.0.2
MySQL版本:5.7.23
Mysql安装
解压到当前目录:
tar -xzvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
mysql主目录处理
在tmp目录下移动文件到/usr/local/下并改名为mysql,在mysql目录下建data目录(可根据实际情况指定目录位置如/data)
查看组和用户情况
cat /etc/group | grep mysql
cat /etc/passwd |grep mysql
创建mysql组和mysql用户
修改配置文件:/etc/my.cnf,配置不对的话,后面初始化不全,会拿不到默认密码。
vim /etc/my.cnf
修改内容:
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
socket=/tmp/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/tmp/mysqld/mysqld.pid
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
max_connections=1000
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
:wq! 保存退出。
创建文件/tmp/mysql.sock:设置用户组及用户,授权
cd /tmp
touch /tmp/mysql.sock
chown mysql:mysql /tmp/mysql.sock
chmod 755 /tmp/mysql.sock
创建文件/tmp/mysqld/mysqld.pid:
mkdir -p /tmp/mysqld
touch /tmp/mysqld/mysqld.pid
chown -R mysql:mysql /tmp/mysqld
chmod 755 /tmp/mysqld/mysqld.pid
创建文件/var/log/mysqld.log:
touch /var/log/mysqld.log
chown -R mysql:mysql /var/log
chmod 755 /var/log/mysqld.log
安装和初始化数据库
进入bin目录:
cd /usr/local/mysql/bin/
初始化数据库:
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
安全启动:
./mysqld_safe --user=mysql &
是否启动成功,可以通过查看mysql进程,ps -ef | grep mysql
默认密码在mysqld.log日志里, 找到后保存到安全的地方:
cat /var/log/mysqld.log
其中root@localhost: 后面的就是默认密码,后面登录用.(如果找不到可能默认是空,登录时密码直接回车,否则可能安装有问题)
进入bin目录:
cd /usr/local/mysql/bin/
登录mysql:
./mysql -u root -p
拷贝或者输入mysqld.log中获得的默认密码,即可进入mysql命令客户端。
但是,若输入相关命令,则会提示你修改用户密码(注意后面一定要加;)。
show databases;
密码修改
mysql> set password=password("xxxxxxxxxxx");
设置远程登录权限
mysql>grant all privileges on *.* to 'root'@'%' identified by ' xxxxxxxxxxx ';
立即生效:
mysql> flush privileges;
退出quit 或者 exit;
mysql> quit;
至此,mysql安装流程已结束。
开机服务启动设置:
把support-files/mysql.server 拷贝为/etc/init.d/mysql:
cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
若没有,则把mysql注册为开机启动的服务,然后在进行查看
chkconfig --add mysql
chkconfig mysql on
创建数据库
分别登录master机和slave机的mysql:mysql –u root –p
创建数据库:create database eraisuat;
master机和slave机的相关配置
1、修改master机器中mysql配置文件
vi /etc/my.cnf
在[mysqld]配置段添加如下字段
server-id=1
log-bin=mysql-bin
log-slave-updates=1
binlog-do-db=eraisuat #需要同步的数据库,如果没有本行表示同步所有的数据库
binlog-ignore-db=mysql #被忽略的数据
在master机上为slave机添加一同步帐号
MariaDB[(none)]>grant replication slave on *.* to 'repl'@'192.168.0.2' identified by 'xxxxxxxxxxxx';
MariaDB[(none)]>flush privileges;
重启master机的mysql服务:service mysqld restart
用show master status 命令看日志情况
通过该命令获得File和Position,在slave中有用 。注:基准这里的“mysql-bin.000004”和“154”,在下面 “(3)设置Slave复制”的配置中会用到
2、修改slave机中mysql配置文件
(1)修改slave机器中mysql配置文件my.cnf,该文件在/etc目录下
同样在[mysqld]字段下添加如下内容
Server_id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
log-slave-updates=1
replicate-do-db=cmxt
replicate-do-db=cmxt_log
replicate-do-db=mysql
slave-parallel-type=LOGICAL_CLOCK #并行模式
slave-parallel-workers=16 #并行数
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
replicate-do-db=repl #要同步的数据库,不写本行表示同步所有数据库
然后重启slave机的mysql:service mysqld restart
(2)在slave机上验证对主机连接
mysql –h192.168.0.2 -urepl –pxxxxxxxx
MariaDB[(none)]>show grants for repl@192.168.0.2;
CHANGE MASTER TO MASTER_HOST='192.168.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='xxxxxxxxxxxxxxx',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
(4)启动Slave
运行SHOW SLAVE STATUS查看输出结果:
主要查看Slave_IO_Running和Slave_SQL_Running 两列是否都为YES
(5)测试主从服务器是否能同步
在主服务器上面新建一个表,必须在repl数据下
mysql> use repl
Database changed
mysql> create table test(id int,name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1,'zaq');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(1,'xsw');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+------+
| id | name |
+-------+------+
| 1 | zaq |
| 1 | xsw |
+-------+------+
2 rows in set (0.00 sec)
在从服务器查看是否同步过来
mysql> use repl;
Database changed
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | zaq |
| 1 | xsw |
+------+------+
2 rows in set (0.00 sec)
说明已经配置成功
主从不同步了解决办法
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:
stop slave; #表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
1.先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock;
注意:该处是锁定为只读状态,语句不区分大小写
2.进行数据备份
#把数据备份到mysql.bak.sql文件
mysqldump -uroot -p -hlocalhost > mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master 状态
mysql> show master status;
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
4.把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令
[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/
5.停止从库的状态
mysql> stop slave;
6.然后到从库执行mysql命令,导入数据备份
mysql> source /tmp/mysql.bak.sql
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;
8.重新开启从同步
mysql> start slave;
9.查看同步状态
mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10.主库解锁
mysql> unlock tables;
pt-table-checksum 和 pt-table-sync
这个两个软件也是很方便,大家可以去了解一下
pt-table-checksum:在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误,更多信息请查看官方资料。
pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。