转:电信网通双线双IP的解决办法(JavaEye)

2010年2月25日 admin 没有评论

javaEye创始人之一robbin于2009-09-01写的。

做互联网网站,最头疼的事情之一就是电信和网通的互联互不通了,为了能够让北方网通和南方电信用户都可以快速的访问网站,解决办法就是托管到双线机房。双线机房有两类,一类是通过BGP技术实现互联互通,服务器只需要一个网卡一个IP地址就可以了,由机房进行路由的智能判断,选择合适的路由访问,这样对于网站来说是很方便的,比方说上海移动的怒江机房,上海地面通的自建机房,科技网的机房,但BGP机房一般带宽都比较少,流量高一些的话可能就没有办法了。另外一种就是双线双IP的机房,带宽可能更高一些,但是路由配置极其复杂,比方说上海电信的市北机房。

因为和谐的原因,JavaEye网站服务器最近被迫从原来的移动怒江双线机房当中搬了出去,由托管商推荐到了上海市北双线机房,市北双线机房实际上是电信机房,但是从天津网通拉了2G专线过来,因此服务器需要至少两个网卡,一个网卡接电信网关,一个网卡接网通网关,来实现互联互通。如果多台服务器的话,还需要第3个网卡组建内网进行内网通讯。

对于双线双IP的服务器来说,要解决两个问题:

一、你的网站用户究竟走那个IP来访问你的服务器
二、你的网站内容究竟走那个IP返回给用户

对于第1个问题,可以使用智能DNS解析来解决,即DNS服务器判断用户所在IP地址,如果用户是电信接入,就把服务器的电信IP解析给他;如果用户是网通接入,就把服务器的网通IP解析给他。

智能DNS可以自己基于开源的DNS软件来定制,不过国内有一个很好的免费智能DNS服务器提供商:DNSPod,推荐使用DNSPod的服务。他就可以实现上述的智能DNS解析。

对于第2个问题,则需要在服务器上面配置路由规则,来决定究竟如何处理数据的返回路径问题。

1、填写静态路由表

因为服务器有两个IP,分别在不同的网段,你使用电信IP的网关做路由,那么网通的IP地址用户压根就访问不到,反之亦然。目前流行的解决办法,就是使用电信网关做默认的路由,然后自己手工填写所有网通IP地址段的路由规则。这个办法可以Google搜索到一大把,不展开了。

这种办法的缺点是添加规则太多太麻烦,而且难免挂一漏万,如果你漏了一些网段,那这些网段的用户就访问不了你的网站了。况且网段地址的分布总是在不断变化的,你还必须定期更新路由表。

2、根据用户访问进来的路径设定动态路由

就是说如果用户是通过电信IP地址访问过来的话,那么使用电信网关做路由,返回内容走电信网关;如果用户通过网通IP地址访问过来的话,那么使用网通网关做路由,返回内容走网通的网关,这样就不必那么麻烦的维护路由表了。以JavaEye网站服务器为例,具体配置方法如下:

JavaEye网站服务器电信IP:114.80.66.199,电信网关:114.80.66.1
JavaEye网站服务器网通IP:60.29.231.190,网通网关:60.29.231.1

1) 默认网关使用电信网关作为路由

在Linux上面配置默认网关,如果是RedHat,应该是在/etc/sysconfig/network文件里面添加一行:GATEWAY=114.80.66.1,如果是SuSE,应该是在/etc/sysconfig/network/routes里面添加一行:default 114.80.66.1 – - 或者可以直接使用YaST2来配置。

2)添加路由表

修改/etc/iproute2/rt_tables,添加内容:

C代码
1.252 tel 电信路由表  
2.251 cnc 网通路由表 
252 tel 电信路由表
251 cnc 网通路由表

然后手工添加路由规则,在Console里面执行如下命令:
C代码
1.#添加原路返回路由  
2.ip route flush table tel  
3.ip route add default via 114.80.66.1 dev eth0 src 114.80.66.199 table tel   
4.ip rule add from 114.80.66.199 table tel  
5. 
6.ip route flush table cnc  
7.ip route add default via 60.29.231.1 dev eth1 src 60.29.231.190 table cnc  
8.ip rule add from 60.29.231.190 table cnc 
#添加原路返回路由
ip route flush table tel
ip route add default via 114.80.66.1 dev eth0 src 114.80.66.199 table tel
ip rule add from 114.80.66.199 table tel

ip route flush table cnc
ip route add default via 60.29.231.1 dev eth1 src 60.29.231.190 table cnc
ip rule add from 60.29.231.190 table cnc

即让从电信IP过来的请求按照电信路由返回,从网通IP过来的请求从网通路由返回。这样就搞定了,是不是很简单?这个办法是bobo同学提供的,感谢他。

3) 把路由规则写入启动脚本

如果服务器重启,或者网络服务重启,上述的路由规则就失效了,所以你需要把上面这段命令写入系统启动脚本和网络启动脚本

如果是RedHat,系统启动脚本是/etc/rc.d/rc.local
如果是SuSE,可以自己写一个启动脚本,链接到S99上,比方说/etc/init.d/rc.local

如果是RedHat,网络启动脚本是/etc/rc.d/init.d/network
如果是SuSE,网络启动脚本是/etc/init.d/network

分类: linux服务器 标签:

PHP定时生成静态html首页

2010年2月25日 admin 6 条评论

网上找到的,记一下。实践证明,可用。

<?php
$nowtime=time();
$pastsec = $nowtime – $_GET["t"];

if($pastsec<60)
{
    exit; //1分钟更新一次,时间可以自己调整
}

ob_start(); //打开缓冲区
include(”index.php”);
$content = ob_get_contents(); //得到缓冲区的内容
$content .= “n<script language=javascript src=”f5.php?t=”.$nowtime.”"></script>”; //加上调用更新程序的代码

file_put_contents(”index.html”,$content);

if (!function_exists(”file_put_contents”))
{
    function file_put_contents($fn,$fs)
    {
        $fp=fopen($fn,”w+”);
        fputs($fp,$fs);
        fclose($fp);      
    }
}

分类: 我的生活 标签:

Zend framework网站管理模块登陆状态检查

2010年1月21日 admin 没有评论

  昨天留下来的问题今天才解决,感谢phpchina上的liuxingyuyuni同学热心帮助。他的回复:http://bbs.phpchina.com/viewthread.php?tid=173081&page=1&extra=#pid1392062

  原本是想用ACL来设定访问权限的,可是不是熟悉,先用Zend_Auth来做个简单的登陆状态检查吧,这样适合小型的网站,不用考虑Role了。

  下面是我的实际应用:

<?php
class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
   
    /*private $_defaultRole = ‘guest’;
    private $_authMCA     = array(
        ‘module’ => ‘cp’,
        ‘controller’ => ‘index’,
        ‘action’     => ‘login’
    )
    private $acl;
    private $auth;

    public function __construct()
    {
        $this->auth = Zend_Auth::getInstance();
        $this->acl  = new Zend_Acl();

        $this->acl->addRole(new Zend_Acl_Role($this->_defaultRole));
        $this->acl->addRole(new Zend_Acl_Role(’administrator’));

        $acl->add(new Zend_Acl_Resource(’cp’));

        $this->acl->allow(’guest’,'cp:index’,array(’login’));
    }*/
    public function __construct()
    {
        
    }

    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        $this->_checkAdminPermit($request);
    }

    private function _checkAdminPermit(Zend_Controller_Request_Abstract $request)
    {
        $redirector = new Zend_Controller_Action_Helper_Redirector();
        if($request->getModuleName() == ‘cp’ && $request->getActionName() != ‘login’ && !Zend_Auth::getInstance()->hasIdentity())
        {
            //action必须判断,否则会进入派遣死循环。
            $login = false;
            if(! $login/** 管理员未登录 */)
            {
                /** 跳到管理员登录页面 */
                $redirector->direct(’login’, ‘index’, ‘cp’);
            }
        }
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        /*这是另外一种权限检查跳转的方法,是指定Action,而不是跳转。根据群里易天同学写的
        访问http://demo.localhost/public/cp/index/index实际上结果是http://demo.localhost/public/cp/index/login
        这种方法/cp/index/index并不跳转到/cp/index/login
        $front = Zend_Controller_Front::getInstance();
        $moduleName = $request->getModuleName();

        if ($moduleName != ‘cp’)
        {
            $error = $front->unregisterPlugin(’acl’);
        }
        else if(!Zend_Auth::getInstance()->hasIdentity())
        {
           $request->setModuleName(’cp’);
           $request->setControllerName(’index’);
           $request->setActionName(’login’);
           //$this->_request->_redirect(”/cp/index/login”); Notice by duliang: 此行方法不行
        }*/
    }
}

分类: zend framework 标签:

无法启动MySQL服务,错误1069

2009年10月22日 admin 没有评论

环境:Windows2003 MySQL5.0

  今天下午5点半左右,网站突然打不开,Ping不通。机房人员说:主机关机了,我晕的。服务器启动后我远程查一下,意外关机,都几个星期没出现过意外关机了。接着刷新一下网站,还是打不开,又看了下,MySQL服务没启动。进管理工具,打开服务,却启动不了。如下图:

mysql_srv_ste

错误提示:理解为MySQL的启动账号有问题,后来换成管理员的了,可以启动了。但是换回原有SQLUSER用户却不行,还以为是权限的问题;最后baidu到一篇关于SQL Server服务启不了的文章,解决了。

管理工具–服务–右键   MySQL–属性–登陆–登陆身份–选择”此帐户”–选择   administrator   ,密码和确认密码中输入你系统中的administrator密码.  

只是奇怪的是:我没有修改过原来SQL用户的密码啊,不过可以确定的是:你修改了系统中用户的密码,MySQL服务的登陆选项卡也得修改成相应的密码。否则重启MySQL你会启动不了,我亲自测试的。

分类: mysql 标签:

CentOS中文乱码

2009年10月17日 admin 没有评论

在CentOS图形界面,用Firefox浏览网站,中文文字显示4方块乱码。到网上查了下,还以为是/etc/sysconfig/i18n默认配置的问题,改了下还是不行。后来又查了下原来是没有安装中文包。

中文支持的包:
fonts-chinese-3.02-12.el5.noarch.rpm //中文字体包
fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm //字体显示包

找到CentOS安装盘:
mount /dev/hdc /mnt
cd /mnt
cd CentOS
rpm -ivh fonts-chinese-3.02-12.el5.noarch.rpm
rpm -ivh fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm

cnpackage

cnpackage2

分类: linux服务器 标签:

CentOS设置系统默认的启动模式(字符、图形)

2009年10月15日 admin 没有评论

CentOS笔记:配置系统启动时默认的启动模式(字符、图形)

方法:
1、vi /etc/inittab
2、找到id:x:initdefault:,我的系统是id:3:initdefault:,即默认以字符模式启动。
3、将3改为5即可,即id:5:initdefault:
4、reboot

startx是在字符模式进入图形模式
init 3是在图形模式进入字符模式

vm下centos上不了网解决办法:
仅供参考:如果本机也是通过路由上网的话,把vmwear的网卡设置成桥接看看,本机拨号上网的话,设置成nat。测试下看看

分类: linux服务器 标签:

CentOS字符操作界面

2009年10月13日 admin 1 条评论

可以使用如下的3种方法进入字符工作方式:

在图形环境下开启终端窗口进入字符工作方式。
在系统启动后直接进入字符工作方式。
使用远程登录方式(Te lne t或SSH)进入字符工作方式。

虚拟控制台

当在系统启动时直接进入字符工作方式后,系统提供了多个(默认为6个)虚拟控制台。每个虚拟控制台可以独立使用,互不影响。
可以使用Alt+F1~Alt+F6进行多个虚拟控制台之间的切换。如果用户使用startx命令在字符界面下启动了图形环境,那么可以使用
C trl+Alt+F1~C trl+Alt+F6切换字符虚拟终端,使用C trl+Alt+F7切换到图形界面。

本地登录和注销

登陆:在登录终端上输入用户名(如:root)和密码(pwd)即可。
注销登录:用户可以在当前的登录终端上输入logout命令或使用<C trl>+<d>快捷键进行。

在Linux环境下使用ssh登录远程Linux系统

Linux下的ssh命令是O pe nSSH的客户端程序。要登录远程Linux系统,必须保证远程Linux系统上启动了O pe nSSH服务器。使用ssh
命令登录远程O pe nSSH服务器的命令格式是:
$ ssh 远程主机上的用户名@远程主机的IP地址或FQDN

系统运行级别

Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和所要达到的目的都不同。
Centos设置了如下表所示的运行级,并且系统可以在这些运行级别之间进行切换,以完成不同的工作。
运行级 说明
0 所有进程将被终止,机器将有序的停止,关机时系统处于这个运行级别
1 单用户模式。用于系统维护,只有少数进程运行,同时所有服务也不启动
2 多用户模式。和运行级别3一样,只是网络文件系统(NFS)服务没被启动
3 多用户模式。允许多用户登录系统,是系统默认的启动级别
4 留给用户自定义的运行级别
5 多用户模式,并且在系统启动后运行X-Window,给出一个图形化的登录窗口
6 所有进程被终止,系统重新启动

1.如果系统启动后进入字符登录界面,则说明系统默认的运行级别为3;如果系统启动后进入图形登录界面,则说明系统默认的运行级别为5。
2. 如果用户已经启动了字符界面,想要进入图形界面可以使用如下命令:
$ startx &

运行级的查看和切换

用户可以使用如下的命令查看当前系统的运行级
runlevel

用户可以使用如下的命令切换运行级
init [0123456Ss]
即在 init 命令后跟一个参数,此参数是要切换到的运行级的运行级代号,如:
用 init 0 命令切换至运行级别 0 ,即关机
用 init 1 命令切换至运行级别 1 ,即进入单用户运行模式
用 init 6 命令切换至运行级别 6 ,即重新启动

也可以使用 te linit 命令,在 CentOS 中,te linit 命令是 init 命令的符号链接。

下面看一个使用 runle ve l 和 init 命令的例子:
# # 显示系统当前运行级别
# runlevel
N 3
# # 系统当前的运行级别为“3”,没有上一次运行级别(用“N”表示)
# init 2
# # 执行“init 2”命令后会在系统控制台中显示相应的停止启动服务信息
# runlevel
3 2
# # 系统当前运行级别已经为“2”,上一次的运行级别为“3”,转换运行级别成功

关机与重启命令

系统的关机和重新启动,实际上是进行运行级别的切换。此次可以使用 init 命令进行关机和重启,命令 init 用于立即关机或重启,但是在多用户系统中,若想给用户发送关机警告信息以便各个用户完成自己的工作并注销登录,则必须使用shutdown、halt 和 re boot 等命
令。

在多用户环境下,通常使用 shutdown 命令关闭和重新启动系统。shutdown 命令能够以一种比较安全的方式来关闭系统,所有登录到系统上的用户将被通知系统将要关闭,而新的登录操作将被阻止;同时所有的进程也将被通知系统将要关闭,这样有些程序,如 vi 将能够及时保存用户编辑的文件并退出。

shutdown 命令的格式为:
shutdown [参数] time [warning-message]

其中:
time :设置多长时间后执行 shutdown 指令,可以使用如下三种格式:
  hh:mm :指定绝对时间,hh用于指定小时,m m 用于指定分钟
  +m :指定相对时间,m 为数字,单位为分钟
  now :现在立刻进行,相当于 +0
warning-message :用于设置发给用户的警告信息

常用参数如下:
-t sec :送出警告信息和删除信息之间要延迟多少秒再通知 init 执行运行级切换
-k :并不真的关闭系统,只是给每个用户发送警告信息
-r :关闭之后重新启动系统
-h :关闭之后停止系统
-f :重新启动后不用fsck检查磁盘
-F :重新启动后强制用fsck检查磁盘

例如:
# # 警告所有用户系统将在5分钟后重新启动系统
# shutdown –r +5 “ System will be reboot in 5 minites, Please save your work.”
# # 立即关闭系统
# shutdown –h now
# # 立即重新启动系统,并在重新启动后强制用fsck检查磁盘
# shutdown –h -F now

分类: linux服务器 标签:

VI使用

2009年10月13日 admin 没有评论

测试环境:Centos5.2,有关Linux系统的基础知识可以在网上搜索。

vi编辑器

三种操作状态,分别是:命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode)

各模式的功能区分如下:

1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。

2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。

3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。

有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。

切换至Insert mode编辑文件在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。

这时候您就可以开始输入文字了。
i: 插入,从目前光标所在之处插入所输入的文字。
a: 增加,目前光标所在的下一个字开始输入文字。
o: 插入新的一行,从行首开始输入文字。

Insert的切换→Command mode,按Esc键

退出vi及存文件

在Command mode下,可按冒号“:”进入Last line mode,例如:
:w filename (输入“w filename”,将文章存入指定的文件名filename)
:wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)
:q! (输入“q!”,强制离开并放弃编辑的文件)

分类: linux服务器 标签:

Mysql主从同步复制总结

2009年9月19日 admin 2 条评论

  经过这两天实验和查资料,对Mysql的同步复制有了一定了解。把相关的结论记下来。

建议:在同步之前,2台Mysql的数据库 数据要一致,就是先把要备份的数据库导入到从slave服务器上。这样可以避免同步出错。

在已经正常同步的情况下:

  下面内容参考了(imysql.cn),测试是亲自操作的。
  如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由 –master-connect-retry 选项来控制,它的默认值是60秒。

每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。

###测试 主############

mysql> select * from demo;
+—————————–+
| title                       |
+—————————–+
| duliang                     |
| 杜亮                        |
| 解决同步故障                |
| 午饭后查看同步正常          |
| 主正常,从重启              |
| master boot,slave boot      |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)

mysql> show master status;
+—————–+———-+————–+——————+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000010 |      337 | gb           |                  |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)

###测试 从############

mysql> show slave status\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.10
                Master_User: root
                Master_Port: 3308
              Connect_Retry: 60
            Master_Log_File: mysqllog.000010
        Read_Master_Log_Pos: 337
             Relay_Log_File: 共享服务器-relay-bin.000023
              Relay_Log_Pos: 234
      Relay_Master_Log_File: mysqllog.000010
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: gb
        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: 337
            Relay_Log_Space: 234
            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
1 row in set (0.00 sec)

ERROR:
No query specified

mysql> select * from demo;
+—————————–+
| title                       |
+—————————–+
| duliang                     |
| 杜亮                        |
| 解决同步故障                |
| 午饭后查看同步正常          |
| 主正常,从重启              |
| master boot,slave boot      |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)

mysql>

####结束###############

相关问答 请参考 http://www.imysql.cn/node/61

问: master还在运行中,如何在不停止它的情况下配置slave?
答: 需要设计几个选项参数。如果已经有了master的备份并且记录了数据快照二进制日志文件名以及偏移位置(运行 SHOW MASTER STATUS 查看结果),执行以下步骤:
确定slave指定了一个唯一的服务器编号。
在slave上执行如下语句,把一些选项值改成实际值:
mysql> CHANGE MASTER TO
    ->     MASTER_HOST=’master_host_name’,
    ->     MASTER_USER=’master_user_name’,
    ->     MASTER_PASSWORD=’master_pass’,
    ->     MASTER_LOG_FILE=’recorded_log_file_name’,
    ->     MASTER_LOG_POS=recorded_log_position; 
在slave上执行  SLAVE  START语句。

问:是否slave总是需要连接到master?
答:不,非必需。slave可以好几小时甚至几天关闭或者不连接master,然后重连再取得更新操作日志。例如,可以在拨号链接上设置一个mater/slave关系,拨号可能只是零星的不定期的连接。这种做法隐含的是,在任何指定的时间里,除非使用特殊的度量标准,否则slave不能保证总是能和master保持同步。在未来,有个选项可以阻止master,除非至少有一个slave在同步中。

问:怎么知道比master晚了多少?也就是说,怎么知道slave最后同步的时间?
答:如果slave是4.1.1或者更高,只需查看 SHOW SLAVE STATUS 结果中的 Seconds_Behind_Master 字段。对于老版本,可以用以下办法。如果在slave上执行 SHOW PROCESSLIST 语句结果显示SQL线程(对MySQL 3.23则是slave线程)正在运行,这就意味着该线程至少从master读取一个更新操作事件。详情请看”6.3 Replication Implementation Details”。

当SQL线程执行一个master上读取的更新操作事件时,它把自己的时间改成事件的时间(这也就是 TIMESTAMP 也要同步的原因)。在SHOW PROCESSLIST 结果中的 Time 字段中,slave的SQL线程显示的秒数就是最后一次同步的时间戳和slave本机的实际时间相差秒数。可以根据这个值来判断最后同步的时间。注意,如果slave已经从master断开好几个小时了,然后重新连接,就能看到slave的
SHOW PROCESSLIST 结果中的SQL线程的Time 字段的值类似3600。这是因为slave正在执行一个小时前的语句。

分类: mysql 标签:

解决Mysql主服务器和Mysql从服务器重启后不能同步复制问题

2009年9月18日 admin 4 条评论

  昨天设置好了mysql主从同步复制,早上上班先看一下slave服务器的同步状态不正常,一想我的电脑的IP地址自动分配为192.168.1.10了,肯定会出问题,于是把slave服务器的:
master-host=192.168.1.9 #主 的IP地址
改为:
master-host=192.168.1.10 #主 的IP地址
再顺便修改了(MySQL Server Instance Config Wizard)从slave服务器实例的字符编码为:gbk。
然后生启mysql,乱码解决了,可同步发现还是不行。

于是在主master上:

mysql> show master logs;
+—————–+———–+
| Log_name        | File_size |
+—————–+———–+
| mysqllog.000001 |       514 |
| mysqllog.000002 |       117 |
| mysqllog.000003 |       117 |
| mysqllog.000004 |       117 |
| mysqllog.000005 |       372 |
| mysqllog.000006 |      1647 |
| mysqllog.000007 |       117 |
| mysqllog.000008 |       205 |
+—————–+———–+
8 rows in set (0.06 sec)

mysql> show master status;
+—————–+———-+————–+——————+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000008 |      205 | gb           |                  |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)

在:D:Program FilesMySQLMySQL Server 5.0duliang_addloog下发现已经产生第8个二进制文件了,每mysql启动一次,就会新增一个二进制文件。
于是:
change master to
master_host=’192.168.1.10′,
master_user=’root’,
master_password=’duliang’,
master_port=3308,
master_log_file=’mysqllog.000008′,
master_log_pos=98;

再:

mysql> show slave statusG;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.10
                Master_User: root
                Master_Port: 3308
              Connect_Retry: 60
            Master_Log_File: mysqllog.000008
        Read_Master_Log_Pos: 98
             Relay_Log_File: 共享服务器-relay-bin.000003
              Relay_Log_Pos: 234
      Relay_Master_Log_File: mysqllog.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: No
            Replicate_Do_DB: gb
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 1050
                 Last_Error: Error ‘Table ‘t1′ already exists’ on query. Default
 database: ‘gb’. Query: ‘create table t1(
id int(5) unsigned not null auto_increment,
username varchar(20) not null,
primary key(id)
)ENGINE=MYISAM’
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 4432
            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: NULL
1 row in set (0.00 sec)

ERROR:
No query specified

mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)

还是不行,注意红色部分:
Relay_Log_File: 共享服务器-relay-bin.000003//在slave服务器下已经有第11个了,这还是第3个文件
Relay_Master_Log_File: mysqllog.000001//主master的已经有第8个了,这还是第1个
从面导致了:Last_Error:不为空,看上文。

接下来baidu资料,用以下方法解决:

mysql> slave stop;
mysql> reset slave;
Query OK, 0 rows affected (0.14 sec)

mysql> change master to
    -> master_host=’192.168.1.10′,
    -> master_user=’root’,
    -> master_password=’duliang’,
    -> master_port=3308,
    -> master_log_file=’mysqllog.000008′,
    -> master_log_pos=98;
Query OK, 0 rows affected (0.14 sec)

mysql> slave start;
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.1.10
                Master_User: root
                Master_Port: 3308
              Connect_Retry: 60
            Master_Log_File: mysqllog.000008
        Read_Master_Log_Pos: 98
             Relay_Log_File: 共享服务器-relay-bin.000002
              Relay_Log_Pos: 234//注:这个位置我不知道用什么命令查,知道的同学告诉我下,谢谢。
      Relay_Master_Log_File: mysqllog.000008
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: gb
        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: 98
            Relay_Log_Space: 234
            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
1 row in set (0.00 sec)

ERROR:
No query specified

OK,一切正常,注意蓝色部分。
解释:

RESET SLAVE
用于让从属服务器忘记其在主服务器的二进制日志中的复制位置。本语句被用于进行一个明确的启动:它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志。

注释:所有的中继日志被删除,即使它们没有被从属服务器SQL线程完全的执行。(如果您已经发布了一个SLAVE语句或如果从属服务器的载入量很大,则这对于一个复制从属服务器是一个很可能出现的情况。)

存储在master.info文件中的连接信息通过使用在对应的启动选项中指定的值,被立即重新设置了。此信息包括主服务器主机、主服务器接口、主服务器用户和主服务器 密码等值。当从属服务器SQL线程被中止时,它位于正在复制的临时表的中间,并且发布了RESET SLAVE,则已被复制的临时表在从属服务器中被删除。

然后再重新指定:
master_log_file=’mysqllog.000008′,
master_log_pos=98;
就可以了。

另一种方法好像是:用CHANGE MASTER TO修改Relay_Log_File和Relay_Log_Pos及Relay_Master_Log_File的值。
不过我没试过,相关信息可以查看手册中:13.6.2. 用于控制从服务器的SQL语句

解决乱码和同步问题,一切OK!

分类: mysql 标签: