博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql主从服务器的搭建
阅读量:6966 次
发布时间:2019-06-27

本文共 5937 字,大约阅读时间需要 19 分钟。

搭建方法:

1.  首先创建两个mysql实例,由于在实际中一台服务器只运行一个实例(mysql线程),这里,我们在一台机器上进行模拟,安装两个mysql程序,选择两个不同的端口889288938892作为主服务器,8893作为从服务器。

2.  设置配置文件

在配置文件my.cnf中有一条语句:

[mysqld]

!include /home/mysql/mysql8892/etc/mysqld.cnf

表示包含/home/mysql/mysql8892/etc/mysqld.cnf文件的配置,所以只需要修改mysqld.cnf中的内容。

主服务器中mysqld.cnf的内容如下

[mysqld]

# server-id必须是唯一的,在1 到 2^32 – 1之间取值

server-id   = 210110051

 

# 二进制日志 – 主库必须开启

log-bin = mysql-bin-m

 

从服务器中mysqld.cnf的内容如下:

[mysqld]

server-id   = 210110052

 

#在从库开启该选项,避免在从库上进行写操作,导致主从数据不一致(对super权限无效)

read-only

 

report-user = mysqlsync  (从库连接主库使用该用户名,便于主库统计信息)

report-host = localhost  (从库连接主库的主机名,便于主库统计信息)

report-port = 8893              (从库使用的端口号)

 

skip-slave-start             (启动数据库后,需手动开启同步进程)

 

master-host = 127.0.0.1        (主库地址,必须使用IP,不能使用域名)

master-user = mysqlsync          (从库连接主库使用该用户名)

master-port = 8892

 

relay-log = mysql-relay           (中继日志,从库开启)

relay-log-info-file = mysql-relay.info(中继日志信息文件,默认为mysql-relay.info

 

replicate-wild-do-table = example1.% (需要同步的表,支持正则表达式,数据库example1下的所有表)

replicate-do-table = example1.table1 (需要同步的表,多个表需多次指定,数据库example1下的table1)

 

# 同步过程中需要忽略的表,支持正则表达式。全库同步时,必须屏蔽mysql系统库和test测试库

replicate-wild-ignore-table = mysql.% 

replicate-wild-ignore-table = test.%

 

replicate-rewrite-db = from_name->to_name  (同步库重命名)

 

slave-net-timeout = 3600 (在所设置的时间内如果没有接收到来自主库的更新,从库则认为和主库的连接断开或失效,重新建立和主库的连接,默认为3600秒,可根据实际需求调整)

 

max_allowed_packet = 32M (任何生成的中间字符串的最大大小。默认为16M,最低配置32M,且不能小于主库该项的值)

 

3.  配置完成后,启动主服务器和从服务器。首先查看从服务器的状态 

mysql> show slave status \G ,如果主服务器信息需要更改,则执行以下语句

    mysql>    change master to

        ->    MASTER_HOST='127.0.0.1'  (在本地使用时不可以使用localhost或127.0.0.1必须使用实际ip地址 查看ip地址的方法 ifconfig 或 hostname -i)

       ->    MASTER_USER='mysqlsync',

       ->    MASTER_PASSWORD='123456',

       ->    MASTER_PORT=8892;

配合mysql> show slave status \G 语句可以每一项单独进行修改。

4.  然后在主服务器中增加同步用并设置其权限:

同步用户的权限设置见规范文档

命令:mysql> grant replication slave  on *.*  to mysqlsync@127.0.0.1 identified by '123456';

关于mysql用户管理见其他日志。

5.  从库启动同步mysql> start slave;

主库可以查看状态

mysql> show processlist \G


mysql> show master status;

从库查看状态:

mysql> show slave status;

从库的Slave_IO_RunningSlave_SQL_Running状态都为Yes,说明同步正在执行。

同步过程如下图所示:

如果从服务器并没有同步主服务器的数据,并且查看从服务器状态时,发现有一下错误信息:

“Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'”


这是由于主从服务器数据不同步造成的,这时可以通过以下几步来处理:

  1. 在从服务器上使用命令stop slave停止从服务器。

  2. 在主服务器上使用命令flush logs 刷新主服务器日志信息。

  3. 在主服务器上使用命令show master status ;查看主服务器状态,主要关注日志文件名称和位置偏移量(position)。

  4. 在从服务器上执行命令change master to master_log_file='mysql-bin.00004',master_log_pos=397;注意文件名和position和主服务器上对应。

  5. 使用命令start slave;启动从服务器的slave线程。

再次在主服务器表中插入数据,就应该能够正常同步了。

=========================================================================


首先在虚拟机中装一台机器,安装上mysql服务器作为从服务器,虚拟机使用桥接模式,让主从服务器在一个网段中。

(一)主服务器配置:

(1)创建复制帐号:

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO hdjay@'192.168.1.%' IDENTIFIED BY '123456';

mysql> flush privileges;

注:mysql配置文件中(/etc/mysql/my.cnf)有skip-networking或bind-address之类的设置,这些往往造成不允许从服务器连接主服务器。

(2)修改配置文件

log_bin = mysql-bin

server-id = 1

(3)重启主服务器(这个很重要!)

(二)从服务器配置:

(1)修改配置文件

log_bin = mysql-bin

server-id = 2

relay_log = mysql-relay-bin  #定义中继日志的位置和文件名

log_slave_updates = 1  # 使从服务器把复制的事件记录到自己的二进制日志中

read_only = 1 #阻止任何没有特殊权限的线程更改数据

(2)使用CHANGE MASTER TO命令连接主服务器

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.118',MASTER_USER='hdjay',MASTER_PASSWORD='123456';

(3)开启从服务器:mysql> start slave;

(4)查看是否启动成功:mysql> show slave status\G;

  注:主要查看Slave_IO_Running和Slave_SQL_Running是否是Yes,不是便有错。

使用show processlist 查看主从服务器,成功的话应该能够查看到主服务器有一个线程状态:“Has sent all binlog to slave; waiting for binlog to be updated”。从服务器应能够看到两个线程状态:“Waitng for master to send event”,"Has read all relay log; waiting for the slave I/O thread to update it".

如果出现错误的话,请从如下几个方面去考虑错误原因:

(1)主服务器和从服务器配置修改后是否重新启动;

(2)从服务器是否能够使用主服务器上创建的复制帐号访问主服务器; 

=========================================================================


首先在主服务器上添加可登陆的用户权限: 

GRANT REPLICATE SLAVE on *.* to 'username'@'host' identified by 'password' 

然后设置主服务器的my.ini文件。 

server-id=1 #主服务器标识 

log-bin #启用二进制日志 

binlog-do-bin=databasename #要备份的数据库名称,多个可以重复该配置过程 

binlog-ignore-db=databasename #不备份的数据库名称,多个可以重复该配置过程 

从服务器的配置 

server-id=2 #从服务器标识,范围1---2E32-1 

master-host=hostname/hostip #主服务器ip或主机名称 

master-user=username #登陆主服务器的用户名 

master-password=password #登陆主服务器的密码 

master-port = portid #主服务器的运行端口号 

replicate-do-db=databasename #要同步的数据库名称,多个可以重复该配置过程 

replicate-ignore=db=databasename #不同步的数据库名称,多个可以重复该配置 

log-bin #从服务器启动二进制日志记录 

master-connect-retry = seconds #与主服务器断开连接后,重新自动连接的时间 

skip-start-slave #防止随服务器的启动而启动同步程序 

至此,一个简单的主从服务器配置完成。 

在master服务器端可运行的命令: 

show master status;#查看主服务器的运行状态 

show slave hosts;#查看从服务器主机列表 

补充: 

在从服务器上使用show slave status 

Slave_IO_Running,为No,则说明IO_THREAD没有启动,请执行slave start [IO_THREAD] 

Slave_SQL_Running为No则复制出错,查看Last_error字段排除错误后执行slave start [SQL_THREAD] 

查看Slave_IO_State字段 

空 //复制没有启动 

Connecting to master//没有连接上master 

Waiting for master to send event//已经连上 

补充:可以使用LOAD DATA FROM MASTER语句来建立slave。但有约束条件: 

数据表要全部是MyISAM表,必须有SUPER权限,master的复制用户必须具备RELOAD和SUPER权限。 

在master端执行RESET MASTER清除已有的日志变更, 

此时slave端会因为找不到master日志无法启动IO_THREAD,请清空data目录下 

relay-log.info,hosname-relay-bin*等文件重新启动mysql 

中继日志文件默认的文件为hostname-relay-bin.nnn和hostname-relay-bin.index。

可用从服务器的-- relay-log和--relay-log-index选项修改。

在从服务器中还有一个relay-log.info中继信息文件,可用 

--relay-log-info-file启动选项修改文件名。 

双机互备则是两个mysql同时配置为master及slave 

主服务器上的相关命令: 

show master status 

show slave hosts 

show logs 

show binlog events 

purge logs to ''log_name'' 

purge logs before ''date'' 

reset master(老版本flush master) 

set sql_log_bin= 

从服务器上的相关命令: 

slave start 

slave stop 

SLAVE STOP IO_THREAD //此线程把master段的日志写到本地 

SLAVE start IO_THREAD 

SLAVE STOP SQL_THREAD //此线程把写到本地的日志应用于数据库 

SLAVE start SQL_THREAD 

reset slave 

SET GLOBAL SQL_SLAVE_SKIP_COUNTER 

load data from master 

show slave status(SUPER,REPLICATION CLIENT) 

CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //动态改变master信息 

PURGE MASTER [before ''date''] 删除master端已同步过的日志

本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1564777,如需转载请自行联系原作者
你可能感兴趣的文章