设置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:
Mysql的启动其实不算复杂,我的理解就是读取配置文件,传递参数,启动。

说的比较简单,其实这里是有关部署的事情,配置文件的部署需要了解,我们看看默认的my.cnf的说明:

引用
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /Data/apps/mysql/var) or
# ~/.my.cnf to set user-specific options.

# www.aslibra.com by hqlulu


也就是说,放在 /etc/my.cnf 是服务器的全局设置
然后是启动的数据库的my.cnf,然后是用户目录的 .my.cnf 文件
最后其实就是启动命令指定的参数,下面自己可以找到方法一步一步验证,我们用port的变化来说明:

1 默认的一般启动形式是如下:

/Data/apps/mysql/bin/mysqld_safe --user=mysql &


如果没有 /etc/my.cnf 的情况下,默认是打开mysql安装目录的 var文件夹,读取权限配置
如果没有相应的表,那就会提示出错:

引用
080502 04:12:23  mysqld started
080502  4:12:23 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
080502 04:12:23  mysqld ended


可以使用bin/mysql_install_db新装一个数据库默认库
如果是表的所有者不是mysql,那会提示:

引用
080502 04:15:37  mysqld started
080502  4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
080502  4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
080502  4:15:37 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
080502 04:15:37  mysqld ended


启动后,看到使用的是 3306端口号

2 如果复制一个配置文档到 /etc/my.cnf 并且修改port参数试试:

[mysqld]
port            = 3307
socket          = /tmp/mysql.sock


同样语句启动后,是3307端口号

3 复制一个文件到 var 目录

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


同样语句启动后,是3308端口号

4 复制一个my.cnf到用户mysql的根目录

cat /etc/passwd 知道:
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

复制一个到 /var/lib/mysql/.my.cnf

[mysqld]
port            = 3309
socket          = /tmp/mysql.sock


同样语句启动后,是3308端口号,看来这个不太成立

5 指定配置文件

复制一个 my_setting.cnf ,修改为3340
/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql &


注意,指定配置文件的参数应该需要在第一个位置出现,互换两个参数的位置会出错了,启动后,确实是3340

6 修改启动参数

/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql --port=3341 &


启动后是 3341端口

阿权的总结:

1 mysql有默认的一些参数,如果没有指定,则取默认值
2 mysql尝试读取 /etc/my.cnf 做默认值
3 mysql尝试读取数据目录的 my.cnf ,取代相应的值
4 mysql的用户目录似乎无效,不太清楚呢 :)
5 mysql启动参数可以指定配置文件位置,优先级次高
6 也可以直接指定具体的参数,优先级最高

Tags:
Mysql有以下几个方面需要做笔记:

1 Mysql的启动参数
(以下文章的基础理论)
1 多实例启动的方式
(保证数据库的连接数,或者开多个端口的服务)
2 主从数据库
(保证数据库的热备份,防止主数据库垮掉)
3 mysql-proxy的尝试
(数据库优化读写性能,读写分开,分流到主从数据库)
4 mysql的定期备份
(防止误操作,可以使得找到近期的快照)

近期搬迁服务器为主,所以涉及服务器的笔记会多一些,是为了下次有需要可以借鉴。

以下是一些参考的或者是值得看的资料:

MySQL双机热备份实施方案
http://blog.csdn.net/sleepbird/archive/2007/08/15/1745261.aspx

MySQL服务维护笔记 作者:车东
http://www.chedong.com/tech/mysql.html

实践MySQL(mysqld)多实例/多版本同时运行 臭豆腐[trydofor]
http://www.trydofor.com/study/study_database_mysql-multi-process.htm

MySQL 同步 译者:叶金荣
http://imysql.cn/2006_05_17_mysql_replication_1

MySQL Proxy 学习笔记 作者:heiyeluren
http://blog.csdn.net/heiyeshuwu/archive/2008/01/28/2069190.aspx
Tags:
数据库同一个版本的倒容易,如果不同版本的,那是只能导出数据,然后再导入数据到另外一个数据库。

主要的是有几个步骤:

1 导出sql文件
2 打包文件并发送到另外一个机器
3 解压文件
4 导入sql文件

主要包含:

sh的数组和循环、mysql的导入导出命令行、服务器间文件传输

比如A服务器上要导出数据可以用如下脚本:

export_db.sh

#!/bin/sh

echo "exporting data,wait..."

database=("aslibra" "work" "mysql")
len=${#database[*]}
socket=/Data/app_1/mysql.sock

i=0
while    [ $i -lt $len ]
do
    echo "export db: ${database[$i]}"
    mysqldump -uroot -pwww.aslibra.com --socket=$socket -l -f --default-character-set=utf8 ${database[$i]}> /Data/bak/aslibra/${database[$i]}.sql
    let i++
done

echo "tar files"
cd /Data/bak
tar cvfz aslibra.tgz aslibra

echo "send files"
scp aslibra.tgz root@www.aslibra.com:/Data/backup/aslibra


这里设置了一个数组database,导出相应的数据库

在另外一个机器上:

import.sh

#!/bin/sh

cd /Data/backup/aslibra

echo "extra files"
tar xvfz aslibra.tgz

echo "importing data,wait..."

database=("aslibra" "work")
len=${#database[*]}
socket=/Data/app_9306/mysql.sock

i=0
while    [ $i -lt $len ]
do
    echo "import db: ${database[$i]}"
    mysql -u root -pwww.aslibra.com --socket=$socket --default-character-set=utf8 ${database[$i]} < /Data/backup/aslibra/aslibra/${database[$i]}.sql
    let i++
done


可以选择导入mysql的库,这样用户权限也导入了,另外,要导入的库需要先建立。
Tags: ,
分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐