• sysctl调整Linux系统性能

    sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点,sysctl(8)提供两个功能:读取和修改系统设置。
    查看所有可读变量:
    %
    sysctl -a
    读一个指定的变量,例如kern.maxproc
    %sysctl kern.maxprockern.maxproc: 1044
    要设置一个指定的变量,直接用variable=value这样的语法:
    #sysctl kern.maxfiles=5000
    kern.maxfiles: 2088 -> 5000
    您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf 看起来很像rc.conf。它用variable=value的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。
    sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用1来表示’yes’,用0来表示’no’)。

    sysctl -w kernel.sysrq=0
    sysctl -w kernel.core_uses_pid=1
    sysctl -w net.ipv4.conf.default.accept_redirects=0
    sysctl -w net.ipv4.conf.default.accept_source_route=0
    sysctl -w net.ipv4.conf.default.rp_filter=1
    sysctl -w net.ipv4.tcp_syncookies=1
    sysctl -w net.ipv4.tcp_max_syn_backlog=2048
    sysctl -w net.ipv4.tcp_fin_timeout=30
    sysctl -w net.ipv4.tcp_synack_retries=2
    sysctl -w net.ipv4.tcp_keepalive_time=3600
    sysctl -w net.ipv4.tcp_window_scaling=1
    sysctl -w net.ipv4.tcp_sack=1

    配置sysctl

    编辑此文件:

    vi /etc/sysctl.conf

    如果该文件为空,则输入以下内容,否则请根据情况自己做调整:

    # Controls source route verification
    # Default should work for all interfaces
    net.ipv4.conf.default.rp_filter = 1
    # net.ipv4.conf.all.rp_filter = 1
    # net.ipv4.conf.lo.rp_filter = 1
    # net.ipv4.conf.eth0.rp_filter = 1

    # Disables IP source routing
    # Default should work for all interfaces
    net.ipv4.conf.default.accept_source_route = 0
    # net.ipv4.conf.all.accept_source_route = 0
    # net.ipv4.conf.lo.accept_source_route = 0
    # net.ipv4.conf.eth0.accept_source_route = 0

    # Controls the System Request debugging functionality of the kernel
    kernel.sysrq = 0

    # Controls whether core dumps will append the PID to the core filename.
    # Useful for debugging multi-threaded applications.
    kernel.core_uses_pid = 1

    # Increase maximum amount of memory allocated to shm
    # Only uncomment if needed!
    # kernel.shmmax = 67108864

    # Disable ICMP Redirect Acceptance
    # Default should work for all interfaces
    net.ipv4.conf.default.accept_redirects = 0
    # net.ipv4.conf.all.accept_redirects = 0
    # net.ipv4.conf.lo.accept_redirects = 0
    # net.ipv4.conf.eth0.accept_redirects = 0

    # Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
    # Default should work for all interfaces
    net.ipv4.conf.default.log_martians = 1
    # net.ipv4.conf.all.log_martians = 1
    # net.ipv4.conf.lo.log_martians = 1
    # net.ipv4.conf.eth0.log_martians = 1

    # Decrease the time default value for tcp_fin_timeout connection
    net.ipv4.tcp_fin_timeout = 25

    # Decrease the time default value for tcp_keepalive_time connection
    net.ipv4.tcp_keepalive_time = 1200

    # Turn on the tcp_window_scaling
    net.ipv4.tcp_window_scaling = 1

    # Turn on the tcp_sack
    net.ipv4.tcp_sack = 1

    # tcp_fack should be on because of sack
    net.ipv4.tcp_fack = 1

    # Turn on the tcp_timestamps
    net.ipv4.tcp_timestamps = 1

    # Enable TCP SYN Cookie Protection
    net.ipv4.tcp_syncookies = 1

    # Enable ignoring broadcasts request
    net.ipv4.icmp_echo_ignore_broadcasts = 1

    # Enable bad error message Protection
    net.ipv4.icmp_ignore_bogus_error_responses = 1

    # Make more local ports available
    # net.ipv4.ip_local_port_range = 1024 65000

    # Set TCP Re-Ordering value in kernel to ‘5′
    net.ipv4.tcp_reordering = 5

    # Lower syn retry rates
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 3

    # Set Max SYN Backlog to ‘2048′
    net.ipv4.tcp_max_syn_backlog = 2048

    # Various Settings
    net.core.netdev_max_backlog = 1024

    # Increase the maximum number of skb-heads to be cached
    net.core.hot_list_length = 256

    # Increase the tcp-time-wait buckets pool size
    net.ipv4.tcp_max_tw_buckets = 360000

    # This will increase the amount of memory available for socket input/output queues
    net.core.rmem_default = 65535
    net.core.rmem_max = 8388608
    net.ipv4.tcp_rmem = 4096 87380 8388608
    net.core.wmem_default = 65535
    net.core.wmem_max = 8388608
    net.ipv4.tcp_wmem = 4096 65535 8388608
    net.ipv4.tcp_mem = 8388608 8388608 8388608
    net.core.optmem_max = 40960

    如果希望屏蔽别人 ping 你的主机,则加入以下代码:

    # Disable ping requests
    net.ipv4.icmp_echo_ignore_all = 1

    编辑完成后,请执行以下命令使变动立即生效:

    /sbin/sysctl -p
    /sbin/sysctl -w net.ipv4.route.flush=1

    我们常常在 Linux 的 /proc/sys 目录下,手动设定一些 kernel 的参数或是直接 echo 特定的值给一个 proc下的虚拟档案,俾利某些档案之开启,常见的例如设定开机时自动启动 IP Forwarding:
    echo “1” > /proc/sys/net/ipv4/ip_forward

    其实,在 Linux 我们还可以用 sysctl command 便可以简易的去检视、设定或自动配置 特定的 kernel 设定。我们可以在系统提示符号下输入「sysctl -a」,摘要如后:abi.defhandler_coff = 117440515

    dev.raid.speed_limit_max = 100000

    net.ipv4.conf.default.send_redirects = 1

    net.ipv4.conf.default.secure_redirects = 1

    net.ipv4.conf.default.accept_redirects = 1

    net.ipv4.conf.default.mc_forwarding = 0

    net.ipv4.neigh.lo.delay_first_probe_time = 5

    net.ipv4.neigh.lo.base_reachable_time = 30

    net.ipv4.icmp_ratelimit = 100

    net.ipv4.inet_peer_gc_mintime = 10

    net.ipv4.igmp_max_memberships = 20

    net.ipv4.ip_no_pmtu_disc = 0

    net.core.no_cong_thresh = 20

    net.core.netdev_max_backlog = 300

    net.core.rmem_default = 65535

    net.core.wmem_max = 65535

    vm.kswapd = 512 32 8

    vm.overcommit_memory = 0

    vm.bdflush = 30 64 64 256 500 3000 60 0 0

    vm.freepages = 351 702 1053

    kernel.sem = 250 32000 32 128

    kernel.panic = 0

    kernel.domainname = (none)

    kernel.hostname = pc02.shinewave.com.tw

    kernel.version = #1 Tue Oct 30 20:11:04 EST 2001

    kernel.osrelease = 2.4.9-13

    kernel.ostype = Linux

    fs.dentry-state = 1611 969 45 0 0 0

    fs.file-nr = 1121 73 8192

    fs.inode-state = 1333 523 0 0 0 0 0

    从上述的语法我们大概可看出 sysctl 的表示法乃把目录结构的「/」以「.」表示,一层一层的连结下去。当然以echo 特定的值给一个 proc下的虚拟档案也是可以用 sysctl加以表示,例如:

    #sysctl –w net.ipv4.ip_forward =”1”

    或是直接在 /etc/sysctl.conf 增删修改特定档案的 0,1值亦可:

    # Enables packet forwarding

    net.ipv4.ip_forward = 1

    # Enables source route verification

    net.ipv4.conf.default.rp_filter = 1

    # Disables the magic-sysrq key

    kernel.sysrq = 0

    当然如果考虑 reboot 后仍有效, 直接在 /etc/sysctl.conf 增删修改特定档案的 0,1值才可使之保留设定(以RedHat 为例,每次开机系统启动后, init 会执行 /etc/rc.d/rc.sysinit,便会使用 /etc/sysctl.conf 的预设值去执行 sysctl)。

    相关参考档案:

    /sbin/sysctl

    /etc/sysctl.conf

    sysctl 及sysctl.conf manpage

    /usr/src/linux-x.y.z/Documentation/sysctl/*

    /usr/share/doc/kernel-doc-x.y.z/sysctl/* (RedHat)

  • 常用php函数

    切换多个 br  成为一个br  preg_replace(“/(<br\s*\/?>\s*)+/”, “<br/>”, $c)

  • MYSQL常用命令

    1.查看MYSQL 数据库编码
    SHOW VARIABLES LIKE ‘character_set_%’;
    mysql> show variables like ‘character_set_%’;
    其中,set_connection是连接编码,latin1是瑞典编码。
    2.导入.TXT文件与导出*.TXT
    load data infile ‘TXT文件的完整路径’ into table 表名;
    linux:TXT文件的完整路径=‘/tmp/aaa.txt’
    windowns:TXT文件的完整路径=’e:\\aaa.txt’
    .txt的文件用Tab隔离
    表中有auto_increment属性的字段,在.txt文件中使用null
    select   *   from  table_name  into  outfile  ‘ path/filename.txt ‘ ;
    3.新增用户
    一:登录进入MySQL数据库后:
    (1).use mysql;
    (2).INSERT INTO `user` VALUES (‘localhost’, ‘newuser’, PASSWORD( ‘newpassword’ ) , ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ”, ”, ”, ”, ‘0’, ‘0’, ‘0’, ‘0’);
    (3).FLUSH PRIVILEGES ;
    提示:PASSWORD函数的运用需要注意版本,参考函数的调用:OLD_PASSWORD
    注意:第三点是插入数据成功后,让他生效的。
    二:用 grant 分配
    grant   all   on   * . *   to  admin @localhost  identified  by   ‘ admin ‘ ;
    说明:  admin 用户(密码为admin)分配所有权限(除grant),对所有数据库和所有表.
    grant   all   on   db_name . *   to  chenlb@ %  identified  by   ‘ chenlbpassword ‘ ;
    说明: chenlb用户有所有权限,只对 db_name的所有表.
    grant   select , insert   on   db_name .tb_name  to  clb @chenlb .com identified  by   ” ;
    说明: clb 用户(密码为空,只有 chenlb.com 主机才有效,
    如果改为%.chenlb.com就对所有后缀为chenlb.com的主机都有效)
    只对 db_name 中的 tb_name 表中有 select,insert 权限.
    权限可以加上(delete,update,drop,create ……)。
    4.重命名表
    ALTER   TABLE  `table_name` RENAME `new_table_neme` ;
    5.改用户密码
    use  mysql;
    update   user   set  password = password(“new_pass”)  where   user = “root”;
    flush  privileges ;
    mysqladmin  – u username  – p pw password newpassword
    6.设远程用户
    use  mysql;
    update   user   set  Host = ‘ % ‘   where   user = ‘ user_name ‘ ;
    flush  privileges ;
    或为特定的IP
    注意:否则,登录时出错–Access denied for user ‘clb’@’localhost’ (using password: YES)
    7.mysql导出\入.sql文件
    导出:
    mysqldump  – u  user_name   – p  [ your_password ]  db_nmae  >  path\ file_name .sql
    如果[your_password]缺省,然后提示输入密码:有密码则输入,否则直接回车
    导入:
    mysql  – u  user   – p  [ your_password ]   db_name   <  path\filename.sql
    同上。
    在linux上导出
    如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
    iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名
    8.设置密码的几种方法
    //不行1.mysqladmin -u user_name password new_password
    9.符合条件的从那里开始,在多少以内.
    select   *   from  talbe_name limit  0 , 30 ;
    说明:从符合条件的第1条开始,读出30条,如果不够30条,取最大.
    10.添加字段
    ALTER   TABLE  `table_name`  ADD  `colum_name`  VARCHAR (  11  )  NOT   NULL  AFTER `colum_name` ;
    11.函数
    select coalesce(null,3,null)
    返回列表的第一个非NULL值
    select greatest(3,5)
    返回列表的最大值
    select least(2,0)
    返回列表的最小值
    12.加入单引号
    INSERT INTO `userinfo` (`id`, `username`, `lastlogin`)
    VALUES (NULL, ”’陈”’, ‘2006-07-28’);
    说明用两个单引号.
    13.输出警告
    warnings
    14.安装/删除服务
    mysqld  — install MySQL –defaults-file=C:\my-opts.cnf
    mysqld –remove
    15.改变自增值
    ALTER TABLE `table_name` AUTO_INCREMENT =1
    16.设主键
    ALTER TABLE `table_name` ADD PRIMARY KEY (`id`)
    17.搜索
    SELECT * FROM `email_list` WHERE relation LIKE ‘%老%’
    18.表结构
    DESCRIBE db_name;
    19.添加索引(即:唯一)
    ALTER TABLE `user` ADD UNIQUE (`username`)
    20.删除
    delete from text order by id desc limit 2;
    21.建表
    CREATE TABLE `tt` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 50 ) NOT NULL
    ) ENGINE = MYISAM ;
    22.帐户
    drop   user  svn @localhost ;

    GRANT ALL PRIVILEGES ON *.* TO admin@”8.8.8.8″ IDENTIFIED BY ‘111111’ WITH GRANT OPTION;

  • MySQL的mysqldump工具的基本用法

    几个常用用例:
    1.导出整个数据库
    mysqldump -u 用户名 -p 数据库名 > 导出的文件名
    mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
    2.导出一个表
    mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
    mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
    3.导出一个数据库结构
    mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
    -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
    4.导入数据库 常用source 命令
    进入mysql数据库控制台,
    如mysql -u root -p
    mysql>use 数据库
    然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
    mysql>source d:\wcnc_db.sql
  • MySQL主从同步配置

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。(这与同步复制可以进行对比,同步复 制是MySQL簇的一个特征)。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个 从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通 知新的更新。
    单向复制有利于健壮性、速度和系统管理:
    ·          主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器。
    ·          通过在主服务器和从服务器之间切分处理客户查询的负载,可以得到 更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器 保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
    ·          使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
    MYSQL复制需要理解注意的地方:
    MySQL复制基于主服务器在二进制日志中记录所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
    二进制日志只是一个从启用二进制日志的固定时间点开始的数据库操作记录。所以设置任何从服务器时,首先要把从服务器的数据库与主服务器开启二进制时的数据库同步。如果启动从服务器时,其数据库与主服务器数据库启动二进制日志时的状态不相同,从服务器很可能失败。
    MYSQL复制设置步骤:
    1.同步主从数据库
    登录数据库管理命令行,执行FLUSH TABLES WITH READ LOCK语句清空所有表和块的写入语句。
    mysql> FLUSH TABLES WITH READ LOCK;
    进入MYSQL的数据库存放路径,使用tar对要设备主从复制的数据库进行压缩归档:
    shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
    确认MYSQL当前是否开启了二进制日志,如果当前已经开启了二进制日志请执行:SHOW MASTER     STATUS;命令,记录当前二进志日志文件名和日志的偏移量,这在设置从服务器时用来确定要读取    二进制日志的位置。
    mysql > SHOW MASTER STATUS;
    +—————+———-+————–+——————+
    | File         | Position | Binlog_Do_DB        | Binlog_Ignore_DB |
    +—————+———-+————–+——————+
    | mysql-bin.003 | 73            | test                    | manual,mysql |
    +—————+———-+————–+——————+
    如果当前没有开启二进制日志请设置MYSQL配置文件,开启MYSQL的二进制功能,然后重新启动 MYSQL,登录到MYSQL命令行,重新启用MYSQL写操作。
    mysql> UNLOCK TABLES;
    接下来把刚才压缩备份的数据库复制到从服务器的数据库存放目录,解压,更改这些文件的权限, 确保对这些文件和目录的权限正确,MySQL的运行用户必须能够读写这些文件。
    2.设置MYSQL配置文件
    确保主服务器的mysql配置文件my.cnf文件的[mysqld]部分包括一个log-bin选项,如果需要只   对某一个数据库进行复制,在log-bin下加入binlog-do-db=XXX和一个server-id=Master_id选项,其中server-id的值必须为1到232–1之间的一个正整数值。
    [mysqld]
    log-bin=mysql-bin
    server-id=1
    登录到MYSQL命令行,为从服务器创建一个同步帐户:
    mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’slave_ip’ IDENTIFIED BY ‘pass’;
    编辑从服务器的MYSQL配置文件,确保从服务器的server-id与主服务器的server-id不冲突。
    [mysqld]
    server-id=2
    3.开始主从同步
    在从服务器上执行下面的语句,用你的系统的实际值替换选项值:
    mysql> CHANGE MASTER TO
    ->MASTER_HOST=’master_host_name’,
    ->MASTER_USER=’replication_user_name’,
    ->MASTER_PASSWORD=’replication_password’,
    ->MASTER_LOG_FILE=’recorded_log_file_name’,
    -> MASTER_LOG_POS=recorded_log_position;
    master_host_name:主服务器的计算机名或IP地址
    replication_user_name:主服务器为从服务器设置的复制帐号
    replication_password:复制帐号密码
    recofded_log_file_name:主从服务器数据库同步时所记录的二进制文件名
    recorded_log_position:主从服务器数据库同步时所记录的二进制偏移量,也就是要读取数据库          日志的位置。
    启动从服务器线程:mysql> START SLAVE;
    执行这些程序后,从服务器应连接主服务器,并执行自从数据库同步以来发生的任何更新。
    从服务器复制时,会在其数据目录中生成dmaster.info和relay-log.info两个 文件。从服务器使用这两个文件记录已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你清楚你正在做什么并完全理解其含义。即使这样,最 好是使用CHANGE MASTER To语句来修改。

    CHANGE MASTER TOmaster_def[,master_def] …

     
    master_def:
           MASTER_HOST = 'host_name'
         | MASTER_USER = 'user_name'
         | MASTER_PASSWORD = 'password'
         | MASTER_PORT =port_num
         | MASTER_CONNECT_RETRY =count
         | MASTER_LOG_FILE = 'master_log_name'
         | MASTER_LOG_POS =master_log_pos
         | RELAY_LOG_FILE = 'relay_log_name'
         | RELAY_LOG_POS =relay_log_pos
         | MASTER_SSL = {0|1}
         | MASTER_SSL_CA = 'ca_file_name'
         | MASTER_SSL_CAPATH = 'ca_directory_name'
         | MASTER_SSL_CERT = 'cert_file_name'
         | MASTER_SSL_KEY = 'key_file_name'
         | MASTER_SSL_CIPHER = 'cipher_list'

    可以更改从属服务器用于与主服务器进行连接和通讯的参数。

    MASTER_USER,MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器连接的信息。

    即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用一个SSL支持已启用的服务器。

    如果您不指定一个给定的参数,则它会保持其原有的值。例外情况在后面的讨论中进行了说明。举例说明,如果用于连接到您的MySQL主服务器的 密码被更改了,您只需发布这些语句,就可以告知从属服务器新的密码:

    mysql>STOP SLAVE; -- if replication was running
    mysql>CHANGE MASTER TO MASTER_PASSWORD='new3cret';
    mysql>START SLAVE; -- if you want to restart replication

    没有必要指定没有改变的参数(主机、接口、用户等)。

    MASTER_HOSTMASTER_PORT是主服务器主机和其TCP/IP接口的主机名(或IP地址)。注意,如果MASTER_HOSTlocalhost相等,那么,和MySQL的其它部分一样,接口可以被忽略(例如,如果可以使用Unix插槽文件)。

    如果您指定了MASTER_HOSTMASTER_PORT,则从属服务器会假定主服务器与以前不一样(即使您指定的主机或接口值与当前值是一样的。)在此情况下,主服务器二进制日志的名称和位置的原有值不再适用,因此,如果您不指定语句中的MASTER_LOG_FILEMASTER_LOG_POSMASTER_LOG_FILE=”MASTER_LOG_POS=4会被静默地添加。

    MASTER_LOG_FILEMASTER_LOG_POS坐标点,从属服务器I/O线程在启动之后从主服务器读取。如果您只指定了其中一个,则从属服务器不能指定RELAY_LOG_FILERELAY_LOG_POS。如果MSATER_LOG_FILEMASTER_LOG_POS都没有被指定,则从属服务器会使用在CHANGE MASTER被发布前的最后一个slave SQL thread坐标。当您只想改变要使用的 密码时,这可以确保复制的连续性。即使从属服务器SQL线程落后于从属服务器I/O线程,也可以确保复制的连续性。

    CHANGE MASTER会删除所有的中继日志文件并启动一个新的日志,除非您指定了RELAY_LOG_FILERELAY_LOG_POS。在此情况下,中继日志被保持;relay_log_purge全局变量被静默地设置为0

    CHANGE MASTER TO可以更新master.inforelay-log.info文件的内容。

    当您拥有主服务器快照并拥有日志和对应的偏移量时,CHANGE MASTER对于设置从属服务器是有用的。在把快照载入从属服务器之后,您可以在从属服务器上运行CHANGE MASTER TO MASTER_LOG_FILE=’log_name_on_master‘, MASTER_LOG_POS=log_offset_on_master

    举例说明:

    mysql>CHANGE MASTER TO
         ->    MASTER_HOST='master2.mycompany.com',
         ->    MASTER_USER='replication',
         ->    MASTER_PASSWORD='bigs3cret',
         ->    MASTER_PORT=3306,
         ->    MASTER_LOG_FILE='master2-bin.001',
         ->    MASTER_LOG_POS=4,
         ->    MASTER_CONNECT_RETRY=10;
     
    mysql>CHANGE MASTER TO
         ->    RELAY_LOG_FILE='slave-relay-bin.006',
         ->    RELAY_LOG_POS=4025;

    第一个例子可以更改主服务器及其二进制日志坐标。当想要设置从属服务器来复制主服务器时使用。

    第二个例子显示了较少被使用的一个操作。当从属服务器含有中继日志,并且您出于某种原因想要执行此日志时使用。要这么做时,不需要连接主服务器。您只需要使用CHANGE MASTER TO并启动SQL线程(START SLAVE SQL_THREAD)。

    您甚至可以在一个用于独立非从属服务器的非复制型设置中使用第二种操作,在崩溃之后进行复原。假设您的服务器已崩溃,同时您已恢复了备份。您想要重新播放服务器自己的二进制日志(不是中继日志,而是正规的二进制文件),例如名为myhost-bin.*。首先,应在安全的地方制作这些二进制日志的备份,以防您没有完全遵守以下步骤,意外地让服务器清理了二进制文件。使用SET GLOBAL relay_log_purge=0,进一步增加安全性。然后启动不含–log-bin选项的服务器。使用–replicate-same-server-id,–relay-log=myhost-bin(让服务器相信,这些正规的二进制日志是中继日志)和–skip-slave-startoptions选项。当服务器启动后,发布以下语句:

    mysql>CHANGE MASTER TO
         ->    RELAY_LOG_FILE='myhost-bin.153',
         ->    RELAY_LOG_POS=410,
         ->    MASTER_HOST='some_dummy_string';
    mysql>START SLAVE SQL_THREAD;

    服务器会读取并执行自己的二进制日志,完成崩溃复原。当复原完成后,运行STOP SLAVE,关闭服务器,删除master.inforelay-log.info,并使用原来的选项重新启动服务器。

    要让服务器认为它是一个从属服务器,需要指定MASTER_HOST(甚至使用假值)。

  • Linux下安装部署SNMP(流量监控)

    前言:
    记录我在一台原本没有安装snmp的服务器上通过源码方式安装最新版本snmp的过程。
    1)查原系统是否安装了snmp
    # rpm –qa | grep snmp
    2)下载、解压、配置、编译、安装
    (到http://www.net-snmp.net/download.html上下载最新的net-snmp版本,目前是5.5。)
    # cd /usr/local/src
    # wget http://cdnetworks-kr-2.dl.sourceforge.net/project/net-snmp/net-snmp/5.5/net-snmp-5.5.tar.gz
    # tar zxvf net-snmp-5.5.tar.gz
    # cd net-snmp-5.5
    # ./configure
    (编译中会有交互过程。如选择版本等。)
    # make
    # make install
    3)指令路径说明
    安装完成之后:/usr/local/sbin/snmpd 是启动snmp的程序,snmp的可执行命令(如,snmpget、snmpwalk等)默认安装在/usr/local/bin下。
    4)snmpd.conf文件
    用find / -name snmpd.conf查找一下snmpd.conf文件,可以发现仅有找到以下一条结查:
    /usr/local/src/net-snmp-5.5/python/netsnmp/tests/snmpd.conf
    将其cp到/etc下:
    cp /usr/local/src/net-snmp-5.5/python/netsnmp/tests/snmpd.conf /etc/snmpd.conf
    5)启动snmp
    用以下命令启动snmp:
    # /usr/local/sbin/snmpd -c /etc/snmpd.conf
    (将/usr/local/sbin/snmpd -c /etc/snmpd.conf 加入到/etc/rc.d/rc.local中,成为开机自动启动)
    6)检查snmp启动情况
    用netstat –anu 查一下是否监听:161端口;
    或用 ps –ef |grep snmp可以检查snmpd的进程
    7)测试snmp取数据
    # snmpwalk -c public -v 2c localhost
    看是否可以出现正常的查询结果。
    8)进行snmpd.conf文件的配置
    但此时仅是在本机上可以进行snmp查询,在另一个服务器上是查不到的,所以还要更改一下/etc/snmpd.conf的配置。
    # 1) 设置监控机的IP或监控机的网段,以及团体字映射到安全名
    com2sec local 192.168.10.2      public
    com2sec monitorhost 192.168.10.1      public
    com2sec mynetwork1 92.168.1.0/24     public
    # 2) 映射组名和安全名
    group MyRWGroup v2c        local
    group MyRWGroup v2c        monitorhost
    group MyROGroup v2c        mynetwork
    # 3)设置mib subtree视图
    view all    included  .1                               80
    # 4) 设置read/write权限
    access MyROGroup “”      any       noauth    exact  all    none   none
    access MyRWGroup “”      any       noauth    exact  all    all    none
  • jQuery性能优化(ie6)

    ie6浏览器,js引擎解析速度很慢,所以只能选择优化js代码

    1.尽量使用#id去寻找元素(id是唯一的,无需遍历和循环DOM)

    2.jQuery中第二快的选择器就是Tag选择器,尽量在Classes前面使用Tags
    eg:var active_light = $(‘#traffic_light input.css’); 比$(‘.css’)快许多

    3.养成保存jQuery对象到一个变量上的习惯
    记住,永远不要让相同的选择器在你的代码里出现多次.

    eg:
    $(‘#traffic_light input.on).bind(‘click’, function(){…});
    $(‘#traffic_light input.on).css(‘border’, ‘3px dashed yellow’);
    $(‘#traffic_light input.on).css(‘background-color’, ‘orange’);
    $(‘#traffic_light input.on).fadeIn(‘slow’);
    取而代之,首现保存jQuery变量到一个本地变量后,再继续你的操作。

    var $active_light = $(‘#traffic_light input.on’);
    $active_light.bind(‘click’, function(){…});
    $active_light.css(‘border’, ‘3px dashed yellow’);
    $active_light.css(‘background-color’, ‘orange’);
    $active_light.fadeIn(‘slow’);

    4.更好的利用链:
    var $active_light = $(‘#traffic_light input.on’);$active_light.bind(‘click’, function(){…})
    .css(‘border’, ‘3px dashed yellow’)
    .css(‘background-color’, ‘orange’)
    .fadeIn(‘slow’);
    这样可以让我们写更少的代码,使JavaScript更轻量。

    5.使用子查询
    jQuery 允许我们对一个已包装的对象使用附加的选择器操作. 因为我们已经在保存了一个父级对象在变量

    里, 这样大大提高对其子元素的操作:
    var $traffic_light = $(‘#traffic_light’),
    $active_light = $traffic_light.find(‘input.on’),
    $inactive_lights = $traffic_light.find(‘input.off’);
    提示: 你可以用逗号分隔的方法一次声明多个局部变量 节省字节数

    6.将 jquery结果缓存到一个全局变量中
    // 在全局范围定义一个对象 (例如: window对象)
    window.$my =
    {
    // 初始化所有可能会不止一次要使用的查询
    head : $(‘head‘),
    traffic_light : $(‘#traffic_light‘),
    traffic_button : $(‘#traffic_button‘)
    };
    function do_something()
    {
    //现在你可以引用存储的结果并操作它们
    var script = document.createElement(‘script‘);
    $my.head.append(script);
    $my.cool_results = $(‘#some_ul li‘);
    $my.other_results = $(‘#some_table td‘);// 将全局函数作为一个普通的jquery对象去使用.
    $my.other_results.css(‘border-color‘, ‘red‘);
    $my.traffic_light.css(‘border-color‘, ‘green‘);
    }

    7.第三,多用父子关系,少用嵌套关系。

    例如,使用parent>child代替parent child。因为”>”是child选择器,只从子节点里匹配,不递归。而” “是后

    代选择器,递归匹配所有子节点及子节点的子节点,即后代节点。

    jQuery选择器使用频率列表

    选 择 器 统计频率
    #id 51.290%
    .class 13.082%
    tag 6.416%
    tag.class 3.978%
    #id tag 2.151%
    tag#id 1.935%
    #id:visible 1.577%
    #id .class 1.434%
    .class .class 1.183%
    * 0.968%

    续表

    选 择 器 统计频率
    #id tag.class 0.932%
    #id:hidden 0.789%
    tag[name=value] 0.645%
    .class tag 0.573%
    [name=value] 0.538%
    tag tag 0.502%
    #id #id 0.430%
    #id tag tag 0.358%
  • 重启网络接口

    重启网络接口即可,networking restart 重启所有”激活”的主机网络接口,ifdown ethN, ifup ethN 重启制定网络接口。

  • jQuery上传插件Uploadify详解及其中文按钮解决方案

    网上找了一天,大家都说Uploadify唯一的缺点就是不支持中文按钮,杯具之前,我看了下Uploadify的API,才发现了几个参数没被大家提及的,这正是解决此问题的关键。(以后坚决养成没事就看API的习惯)
    Uploadify有一个参数是 buttonText 这个无论你怎么改都不支持中文,因为插件在js里用了一个转码方法把这个参数的值转过码了,解码的地方在那个swf文件里,看不到代码,所以这条路不行。
    另一个参数,网上很少提到,是 buttonImg( 按钮图片),这时你完全可以用一个图片来替换掉插件自带的那个黑色的flash浏览按钮,只要你自己的图片上是中文,这不就解决了中文按钮问题么?如果只加这一个,你会发现你的按钮图片下面有一片白色区域,其实就是那个flash留下的,白色区域表示鼠标可用范围,这个范围可以用width,height来调整。还有一个参数 wmode 它的默认值是opaque,把它改成transparent就行了,也就是把那片白色区域透明化。再用刚才说的方法,把按键点击范围设置成跟你图片一样大就完全OK了。
    ============================================
    Uploadify的用法就不说了,网上文章很多,跟别的jquery插件用法一样,就是几种文件的摆放路径而已。
    以下附上Uploadify部分参数的介绍,要看全部的就去看其API文件了,一般在下载的包里都有。
    uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后弹出打开文件对话框,默认值:uploadify.swf。
    script : 后台处理程序的相对路径 。默认值:uploadify.php
    checkScript :用来判断上传选择的文件在服务器是否存在的后台处理程序的相对路径
    fileDataName :设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata
    method : 提交方式Post 或Get 默认为Post
    scriptAccess :flash脚本文件的访问模式,如果在本地测试设置为always,默认值:sameDomain
    folder : 上传文件存放的目录 。
    queueID : 文件队列的ID,该ID与存放文件队列的div的ID一致。
    queueSizeLimit : 当允许多文件生成时,设置选择文件的个数,默认值:999 。
    multi : 设置为true时可以上传多个文件。
    auto : 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。
    fileDesc : 这个属性值必须设置fileExt属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileDesc为“请选择rar doc pdf文件”,打开文件选择框效果如下图:
    fileExt : 设置可以选择的文件的类型,格式如:’*.doc;*.pdf;*.rar’ 。
    sizeLimit : 上传文件的大小限制 。
    simUploadLimit : 允许同时上传的个数 默认值:1 。
    buttonText : 浏览按钮的文本,默认值:BROWSE 。
    buttonImg : 浏览按钮的图片的路径 。
    hideButton : 设置为true则隐藏浏览按钮的图片 。
    rollover : 值为true和false,设置为true时当鼠标移到浏览按钮上时有反转效果。
    width : 设置浏览按钮的宽度 ,默认值:110。
    height : 设置浏览按钮的高度 ,默认值:30。
    wmode : 设置该项为transparent 可以使浏览按钮的flash背景文件透明,并且flash文件会被置为页面的最高层。 默认值:opaque 。
    cancelImg :选择文件到文件队列中后的每一个文件上的关闭按钮图标
    Uploadify还自带了很多参数及有用的方法和回调函数,都在API里,虽然是全英文的,但很容易看懂,这里就不说了。
    以下是我用到的代码,可以参考一下:
    <script type=”text/javascript”>
    $(document).ready(function() {
    $(“#uploadify”).uploadify({
    ‘uploader’       : ‘images/uploadify.swf’,
    ‘script’         : ‘<%=request.getContextPath()%>/content/ImportScheduleCommitAction.do’,
    ‘cancelImg’      : ‘images/cancel.png’,
    ‘folder’         : ‘/’,
    ‘queueID’        : ‘fileQueue’,
    ‘fileDataName’   : ‘uploadify’,
    ‘fileDesc’       : ‘支持格式:xls.’,
    ‘fileExt’        : ‘*.xls’,
    ‘auto’           : false,
    ‘multi’          : true,
    ‘height’         : 20,
    ‘width’          : 50,
    ‘simUploadLimit’ : 3,
    //’buttonText’     : ‘fdsfdsf…’,
    ‘buttonImg’      : ‘images/browse.jpg’,
    // ‘hideButton’     : true,
    // ‘rollover’       : true,
    ‘wmode’          : ‘transparent’ ,
    onComplete       : function (event, queueID, fileObj, response, data)
    {
    $(‘<li></li>’).appendTo(‘.files’).text(response);
    },
    onError          : function(event, queueID, fileObj)
    {
    alert(“文件:” + fileObj.name + ” 上传失败”);
    }
    // onCancel         : function(event, queueID, fileObj)
    // {
    //     alert(“取消文件:” + fileObj.name);
    // }
    });
    <script type=”text/javascript”>
    $(document).ready(function() {
    $(“#uploadify”).uploadify({
    ‘uploader’       : ‘images/uploadify.swf’,
    ‘script’         : ‘<%=request.getContextPath()%>/content/ImportScheduleCommitAction.do’,
    ‘cancelImg’      : ‘images/cancel.png’,
    ‘folder’         : ‘/’,
    ‘queueID’        : ‘fileQueue’,
    ‘fileDataName’   : ‘uploadify’,
    ‘fileDesc’       : ‘支持格式:xls.’,
    ‘fileExt’        : ‘*.xls’,
    ‘auto’           : false,
    ‘multi’          : true,
    ‘height’         : 20,
    ‘width’          : 50,
    ‘simUploadLimit’ : 3,
    //’buttonText’     : ‘fdsfdsf…’,
    ‘buttonImg’      : ‘images/browse.jpg’,
    // ‘hideButton’     : true,
    // ‘rollover’       : true,
    ‘wmode’          : ‘transparent’ ,
    onComplete       : function (event, queueID, fileObj, response, data)
    {
    $(‘<li></li>’).appendTo(‘.files’).text(response);
    },
    onError          : function(event, queueID, fileObj)
    {
    alert(“文件:” + fileObj.name + ” 上传失败”);
    }
    // onCancel         : function(event, queueID, fileObj)
    // {
    //     alert(“取消文件:” + fileObj.name);
    // }
    });
    要注意的是,我的script属性值是一个请求路径,我发现在我设置了同时上传多个文件后(比如3),并不是每请求一次去上传3个文件,而仍然是执行3次请求,请求一次上传一个文件。这也没办法,uplodify有那么多回调函数,要是一次处理多个,那回调函数的参数就不知道拿哪个了,因为这些参数都不是数组。
    也就是说,无论你设置同时上传几个文件,它都会一个一个去请求并上传,只是表面上感觉好像有多个线程同时在处理上传请求一样,只是表象而已。而且如果你把simUploadLimit设置过大就会经常出错,我设置成5的时候经常会有一两个文件上传失败。