• 2015-05-15

    MySQL 在线增加从库

    Views: 8182 | 2 Comments

    Master

    创建用户:

    GRANT REPLICATION SLAVE ON *.* TO 'userx'@'server_b' IDENTIFIED BY 'xxxxx';
    

    导出数据:

    mysqldump --all-databases --master-data > dbdump.sql
    

    导致的 dbdump.sql 里会包含 binlog 的位置.

    Slave

    CHANGE MASTER TO MASTER_HOST='server_a';
    CHANGE MASTER TO MASTER_USER='userx';
    CHANGE MASTER TO MASTER_PASSWORD='xxxxx';
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
    start slave;
    show slave status\G
    
    Posted by ideawu at 2015-05-15 10:14:21
  • 2015-05-08

    在Linux进行IO的正确姿势

    Views: 17008 | 9 Comments

    很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, 所谓的 IO, 主要是 read()/write() 两个函数.

    先说错误的 IO 读操作:

    int ret = read(fd, buf, len);
    if(ret == -1){
        exit(-1);
    }else if(ret == 0){
        close(fd);
    }
    

    看起来好像很正确的样子, 返回值也判断了, 不仅判断 -1, 还判断 0, 应该姿势正确吧? 错! 完全错误! 因为你忽略了 errno 的处理. 仔细看文档, 函数返回 -1 不能完全代表 fd 错误, 还需要结合 errno.

    接下来这样改:

    int ret = read(fd, buf, len);
    if(ret == -1){
        if(errno == EINTR){
            // 怎么办?
        }else if(errno == EAGAIN){
            // 怎么办?
        }
        exit(-1);
    }else if(ret == 0){
        close(fd);
    }
    

    EINTR 表示 read() 函数调用被系统中断了, 调用者和 fd 都没有问题, 有问题的是操作系统. 而 EAGAIN 是在非阻塞 IO 时会出现. 上面的代码判断了 errno, 但不知道下一步该怎么做, 还不行.

    在 Linux 下进行 IO 操作的正确姿势是:

    while(1){
        int ret = read(fd, buf, len);
        if(ret == -1){
            if(errno == EINTR){
                continue;
            }else if(errno == EAGAIN){
                // 根据你和调用者的约定, 返回一个数值告诉它再次重试
                // 一般是结合 select/epoll 等 IO 多路复用函数
            }
            exit(-1);
        }else if(ret == 0){
            close(fd);
        }
        // proc
        break;
    }
    

    没错, 在 read() 外面包一个 while(1). 以后你看到有谁写的 read() 代码不是被包含在一个死循环里, 你就可以下结论说这段代码不完善.

    写 IO 的 write() 函数也是类似用法. 建议有心人可以参考 sim 框架的代码, 看看别人是怎么做的, 程序员应该多造轮子, 但不要关起门来造车.

    Posted by ideawu at 2015-05-08 10:56:24
  • 2014-10-09

    Linux 家目录目录下的 sent 文件

    Views: 7291 | No Comments

    最近比较奇怪, 发现家目录下多了一个名为 sent 的文件, 不断增大体积. 看了一下, 里面的内容都是邮件.

    最后才发现原来是 mutt 客户端. 只需要生成一个 .muttrc, 填写相应配置即可:

    # ~/.muttrc
    set copy=no
    
    Posted by ideawu at 2014-10-09 20:19:49
  • 2014-08-14

    Linux 添加用户账号

    Views: 7391 | No Comments

    useradd test
    passwd test
    # 强制用户登录时修改密码
    chage -d 0 test

    Posted by ideawu at 2014-08-14 12:11:58
  • 2013-11-11

    初学者的 Linux 安装 Nginx PHP fpm 配置教程

    Views: 39176 | No Comments

    网上的很多 Linux 操作系统下安装 Nginx + PHP 的教程都很老, 而且各种依赖, 对于初学者来说比较容易混淆, 所以, 我重新写了此篇博客, 用于介绍最简单的 Linux 下安装 Nginx + PHP 的方法.

    此文会经常更新, 保持与时俱进. 如果你不是在 ideawu.net 网站看到本文, 请访问 ideawu.net, 阅读最新的版本.

    -------------------2016-12-22 更新----------------------
    现在, 我建议你使用 CentOS 6.x, 然后用 yum 来安装各个软件.
    --------------------------------------------------------
    

    Continue reading »

    Posted by ideawu at 2013-11-11 23:25:46 Tags: ,
  • 2013-09-28

    解决从github匿名获取只读repo错误

    Views: 19020 | No Comments

    如果想从 github 上匿名获取某个 repo, 一般都会直接到该 repo 的网页复制网页中给的 HTTPS URL. 但是, 不知道 github 抽风还是怎么了, 获取总是报错:

    $ git clone https://github.com/ideawu/ssdb.git
    Initialized empty Git repository in /xxx/.git/
    Cannot get remote repository information.
    Perhaps git-update-server-info needs to be run there?
    

    只好尝试使用 SSH 方式(非 github 登录用户看不到 SSH 方式的 URL):

    $ git clone git@github.com:xxx/ssdb.git
    Initialized empty Git repository in /xxx/ssdb/.git/
    Permission denied (publickey).
    fatal: The remote end hung up unexpectedly
    fetch-pack from 'git@github.com:xxx/ssdb.git' failed.
    

    显然, 这需要输入账号和密码. 我记得 github 改版之前, 是提供了 Read-only URL 的, 不知道为什么改版之后就不提供了?! 不过, 你还是可以手工拼出只读 SSH:

    git clone git://github.com/ideawu/ssdb.git
    

    把项目的网址中的"https://"替换成"git://", 然后在末尾加上".git".

    Posted by ideawu at 2013-09-28 17:03:56 Tags:
|<<<123456789>>>| 3/14 Pages, 84 Results.