设置Mysql的主从设置很重要,有如下几点用处:

1 做备份机器,一旦主服务器崩溃,可以直接启用从服务器作为主服务器
2 可以直接锁定从服务器的表只读,然后做备份数据,这样不会影响主服务器的服务
3 可以处理读写数据库的负载均衡

阿权总结的设置主从的要点有如下:

1 主从服务器的启动方式的不同点
2 主服务器只读或者停止服务然后获取当前数据快照,清理日志或者重新开始记录日志
3 从服务器一般需要只读,否则容易产生错误导致同步失败

阿权制作主从的过程总结:

1 停止数据库服务,并且删除当前的所有mysql日志(默认是mysql-bin.*)
2 把当前的所有数据库打包,备用
3 打包完成后,主服务器可以启动了
4 把从服务器的同步日志删除(默认是mysql-relay-bin.*)
5 把文件解压到从服务器的数据目录
6 设置好cnf文件,启动即可

当然,取得快照的方法还有别的:
1 FLUSH TABLES WITH READ LOCK 锁定所有表
2 打包文件或者是直接导出数据,比停止服务好的地方就是有一段读数据库的时间
3 然后 unlock tables

主从的配置区别:

启动方式请参考《Mysql多实例启动
主服务器没有设置 master的值,下面的参数影响同步:

#设定不同步的数据库,这些库的修改不会记录到日志,可以添加多行
binlog-ignore-db = test
#设定记录的库,可以添加多行
binlog-do-db = vnet


从服务器设置了系列master的参数:

master-host = 192.168.1.147
master-port = 3308
master-user = usr
master-password = pwd
master-retry-count = 999
master-connect-retry = 60

#并且可以设置忽略的库,可以添加多行
replicate-ignore-db = testdb
#设置仅处理的库,可以添加多行
replicate-do-db = aslibra


设置忽略的和处理的参数的一个就好,如果需要忽略哪些,就加上忽略的库,如果仅仅需要处理一两个,那就加上do-db的设置吧

如何检查同步情况?

show master status;
show slave status;

这里会列出当前同步的情况,包括同步哪些库,忽略哪些库

如何检查发生同步错误?

1 主服务器更新后没有反映在从服务器,这个是看的到的
2 可以使用phpmyadmin看进程或者是命令 SHOW PROCESSLIST
主服务器会有一条slave用户的记录,比如
slave   127.0.0.1:42157   无   Binlog Dump   598   Has sent all binlog to slave; waiting for binlog to be updated   ---  

从服务器会有两条记录
system user      无   Connect   724   Waiting for master to send event   ---  
system user      无   Connect   187   Has read all relay log; waiting for the slave I/O thread to update it   ---  

如果同步失败,则后一条没有

同步特性及已知问题

跨库的操作是不更新的,比如

update dbtest.aslibra set domain='www.aslibra.com' where id=5


更多内容可以参考《同步特性及已知问题》,这里就不详细列出了啦

哪些从服务器操作会导致错误?

1 删除表或者修改表结构会导致之后更新该表产生错误,可以恢复原先结构再继续同步就可以,错误如下

080503  4:41:03 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000003' at position 244, relay log '/Data/mysql3309/var/mysql-relay-bin.000004' position: 381080503  4:44:00 [ERROR] Slave: Error 'Can't DROP 'id'; check that column/key exists' on query. Default database: 'dbtest'. Query: 'ALTER TABLE test DROP id', Error_code: 1091080503  4:44:00 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000004' position 252


2 从服务器如果写入一条记录,自增字段加一,主键唯一性错误,这样主服务器就无法同步这样的数据,导致同步停止。如果不产生主键冲突的数据是不会有影响

INTO aslibra (id, ddd) VALUES ('', '2008-05-02')', Error_code: 1062
080503  4:36:44 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000003' position 244


3 从服务器删除某条数据,主服务器再删除该条数据,不会产生错误

阿权的总结:

1 从服务器如果需要重新做同步数据,必须是主服务器开始记录日志的数据快照。所以快照很重要,可以用该快照立刻构建一个从服务器。
2 日志只是记录sql语句,执行删除和更新如果与主服务器数据不同是不会产生错误
3 如果执行插入数据,产生主键冲突则会导致错误,停止同步,除非从服务器执行本语句正常,则可以继续同步
4 表结构修改如果返回错误,则也会导致同步停止
Tags:
多实例启动其实也不复杂,前面《Mysql的启动参数》已经说过了,可以指定配置文件,那其实在启动的时候指定配置文件,那就是独立的一个服务了,可以自行配置了。

总结一下mysql启动需要哪些东西:

1 配置文件
2 数据库目录里的mysql库
3 pid文件
4 sock文件

权限问题就不用说了,主要说一下如何部署更加方便合理,操作简单。

车东的文章提及的mysql维护经验不错,阅读完毕可能觉得还是有完善点的方案,在我的处理方式可能就希望把一些东西再整理一下。

1 app_1、app_2之类的文件夹并不好,无法知道运行的端口号
2 部署我觉得可以考虑主从的启动方式
3 常规参数我觉得在配置文件里独立指定也不错
4 启动脚本可以只考虑变动的文件夹,这样脚本复制了也不用修改

下面说一下部署的内容:

1 脚本三个,作为主服务器启动、作为从服务器启动、关闭
2 配置文件两个,主服务器启动的和从服务器启动的
3 数据库指定在var目录,也方便打包

我觉得可以把文件夹名曰 mysql<port> ,目录形式如下:

[root@bogon mysql3308]# ls -R
.:
master_start.sh  my_master.cnf  my_slave.cnf  slave_start.sh  stop.sh  var

./var:
bogon.err  dbtest  mydb  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  mysql.pid  mysql.sock

./var/dbtest:
(省略)

./var/mydb:
(省略)

./var/mysql:
(省略)


下载文件代码:

主服务器启动脚本 master_start.sh

#!/bin/sh
rundir=[']dirname "$0"[']
datadir=$rundir"/var"
echo "server path : $rundir"
echo "data path : $datadir/"

/Data/apps/mysql/bin/mysqld_safe \
--defaults-file="$rundir"/my_master.cnf \
--pid-file="$rundir"/mysql.pid \
--datadir="$datadir" \
--socket="$rundir"/mysql.sock \
&


从服务器启动脚本 slave_start.sh

#!/bin/sh
rundir=[']dirname "$0"[']
datadir=$rundir"/var"
echo "server path : $rundir"
echo "data path : $datadir/"

/Data/apps/mysql/bin/mysqld_safe \
--defaults-file="$rundir"/my_slave.cnf \
--pid-file="$rundir"/mysql.pid \
--datadir="$datadir" \
--socket="$rundir"/mysql.sock \
&


配置文件 my_master.cnf

[mysqld]
port            = 3308
socket          = /tmp/mysql.sock
user            = mysql

skip-locking
skip-name-resolve

max_connect_errors=100000
max_connections=1024
wait_timeout=600

key_buffer = 256M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

binlog-ignore-db=mysql,test,information_schema
log-bin=mysql-bin

server-id       = 1

#部分内容
#注意:参数也没细调节,忽略掉底下的其它栏目


从服务器的配置差不多,但指定了一些特殊的内容:
server-id       = 1 以下的更替为:

server-id       = 2
master-host     =   192.168.1.41
master-user     =   aslibra
master-password =   aslibra.com
master-port     =  3306

#read-only


具体参数就先不讨论了,下次再说

停止的脚本 stop.sh

#!/bin/sh
rundir=[']dirname "$0"[']
echo "$rundir"
/Data/apps/mysql5/bin/mysqladmin -uaslibra -paslibra.com  -S"$rundir"/mysql.sock shutdown

Tags:
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐