mysql重启后Incorrect information in file相关的错误

修改完/etc/my.cnf的配置一直没有重启,今天重启了一下,看似一切正常,但是却没法访问原有的数据表,出现类似的提示:
Incorrect information in file: ‘./DATABASE_NAME/TABLE_NAME.frm’

仔细查看mysql的错误日志文件,发现提示ib_logfile0文件大小设置不正确:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 268435456 bytes!

下面即时具体受影响的数据表信息。

显然mysql启动时会对比ib_logfileN和配置里设置的文件大小,可见是我更改innodb_log相关的配置导致的:
> innodb_log_file_size = 256M
> innodb_log_files_in_group = 3
< innodb_log_file_size = 5M < innodb_log_files_in_group = 2

改回以前配置就没有问题了。

另外,把相应的ib_logfile删除了,启动时也可以再生成一份。

参考:
http://forums.mysql.com/read.php?22,181434,181701
http://sech.javaeye.com/blog/462740

使用rsync备份文件

事实证明,rsync是个很好的备份工具,无论目标地址是网络还是本地。

1. 备份本地根目录下/dev, /home目录意外的目录
rsync -av --exclude=/dev --exclude=/home / /mnt/sdb1/root/

2. 通过ssh拷贝(备份整个目录的文件)
rsync -av smzz.org:/file/to/path/ /file/to/path/

反过来上传目录也可以:
rsync -av /file/to/path/ smzz.org:/file/to/path/

非默认ssh端口下,以56789为例
rsync -av -e 'ssh -p 56789' /file/to/path/ smzz.org:/file/to/path/

当然,也可以通过rsync自己的协议备份数据,网上例子很多,就不在此累赘。

需要特别注意的时,如果是备份目录,源目录一定要对应上,特别是后面的斜杠,否则就差之毫厘失之千里,
比如:
如果写成
rsync -av /file/to/path smzz.org:/file/to/path/
那么将会备份至服务器的/file/to/path/path/ 目录下

slackware下试用ibus输入法

步骤:
1. 删除相关的输入法,我用的是scim:
ls /var/log/packages | grep scim | xargs sudo removepkg

2. 安装ibus,我是从SBo上下载的安装脚本(链接
同时还需要gconf、pyxdg两个软件包。

3. 更改配置
sudo chmod +x /etc/profile.d/ibus.{csh,sh}

4. 重启X即可

注意:
1. ibus-qt不是必须的
因为我依然可以在opera、freemind等基于qt的程序里调用ibus输入中文

2. 有关scim以及输入法相关的配置,可参见slackware里的CHANGES_AND_HINTS.TXT文件

3. ibus的官方地址在:
http://code.google.com/p/ibus

总结:
可以很好的支持全拼输入,我刚测试连续输入了一个整句,ibus居然都可以识别。正如永杰同学的签名所言,ibus is greate。

2009系统架构师大会听课笔记

周末参加了2009系统架构师大会,期间对自己感兴趣的话题做了部分笔记,现摘录如下:

大型可扩展系统架构-新浪网动态应用平台介绍

童剑 新浪高级系统架构师,研发中心平台部总监

 - 资源监控
 - HA Xen虚拟化
 - 数据库集群

 2006年点击量3亿/天
 实时访问统计,考虑恶意访问
 代码分发、数据库集群、软件仓库

 高可用、低成本、可扩展
 - 无单点故障
 - 基于开源软件
 - 各部门共享、对外透明
   统一运行环境
 - 统一配置
 简单映像体系
  (程序员看来)一个数据库、一个前台、一个缓存

 架构图
            |---> Cache ----->| 
 负载平衡 --|     \|/         | VFS
            |---> App ------->|

 用到的软件
 - LAMP
 - Memecached
 - Squid-Cache
 - Heartbeat + DRBD
 - Xen
 - Cfengine
 - Bind DNS + Mon
 - Haproxy

一些经验
 - 借鉴成功经验
   如LiveJournal(Memcached、MogileFS)、Yahoo、Google、FaceBook等
 - 使用成熟软件
   重复造的轮子维护困难、不便于交接
 - 底层封装和隔离
   可扩展
 - 简单 = 高效
   够用、分阶段完善、简单(结构设计+实现方法) = 高效(开发过程 + 故障排除)
标准化配置
 - 好处
   开发生产分离、配置文件
 - 运行环境配置
   软件包、版本、路径、用户等
   记录请求时长、MySQL慢日志
   常用配置统一
 - 其他...
约定和限制
 - 基本约定
   读写分离、缓存尽量使用Memcache、不用绝对路径、程序目录+x-w、数据库目录+w-x、不使用长连接、耗时查询小于1次/分钟
 - 必要配置
   涉及PHP安全方面的配置等
监控报警
 - 详细感知
 - 自动控制和修复
 - 日志统计分析
 - 数据监控
	* 可用性(ping/port/disk usage)
	* 容量(带宽、磁盘、CPU)
	* 质量(响应速度、成功率)
	* 异常(进程、访问量)
 - 主动处理尝试
	* 拒绝恶意IP
	* 暂停异常服务
	* kill异常进程
 - 报警
	* 仪表板
	* Email
	* SMS
	* IM
性能
 - 高可用
 - 开发语言的选择
   如果对CPU等资源占用不大,可选择解释性脚本语言(C虽然高效,但是从头再来毕竟耗费人力物力)
 - 选择合适的服务器软件
   高并发高IO时可选择Nginx/lighttpd
 - 软硬件因素
 - 网络性能
   应熟悉常见现象
 - 性能分析
   对症下药才能治本
容量规划
 - 负载 < CPU的核数
 - 平常占用资源的40%,峰值80%
 - 60%扩容
 - 20% 保留给系统管理和监控使用

 提问:如果多个机房中的某个机房的服务器出现问题,怎么做到切换服务器不影响访问?
 回到:在DNS里设置某个域名的相应时间,所有Name Server都应该遵循该规范

Facebook最佳实践:从百万访问到千万并发访问

吴静涛:F5中国技术总监,高级架构师

- 柔性可用
- 客户诊断
- 降级服务
故障梯度服务(以qzone为例)
 - 100% 最优
 - 80% 取消增值服务
 - 50% 基础功能
 - 20% 核心功能
 - 5% 公告
缓存、性能
 - 用户端Cache
 - CDN
 - 核心动态数据
 - 提升动态数据能力
   TTC : 腾讯内存Cache集群
   TTC1、TTC2 ----> DB
   TTC1、TTC2 --> TTC0 ---> DB
 - UGC内容放入存储平台
 - 按需加载
 - 检测平台、持续优化
其他
 - 产品削锋填谷
   以前一天只允许在0点开始买卖奴隶,造成该时段访问压力特别大,经产品策划协商,
   更改策略:一天内0 - 9点均可开始买卖努力,但早上6点前买卖奴隶收入减半。。从
   而通过策略将峰值下降很多
 - 集群、轻量、标准
  GSLB + LVS + Qzhttp
 - 轻量内存
  TTC + MySQL
 - 逻辑?
   S++ ?
 - 海量数据存储
   TFS、TDB
 - 削锋填谷
	* 明星 - 低
	* 金牛 - 合理
	* 瘦狗 - 高
其他:采集用户打开时间、多写少读(可在内存里积累一定的程度再去写)

电子支付系统的分布式服务架构与开放架构研究(PPT)

程立:支付宝(中国)网络技术有限公司 首席架构师

 - SOA
 性能、响应时间、指标
 Async异步调用、future异步调用
 - 容量
	* 估算新业务上线对容量的需求
	* 服务吞吐量优化
	 	- 服务吞吐量
		- 伸缩公式
		- 伸缩上限
		- 单个资源吞吐量上限(串行处理)
	* 解决
		- 充分扩容
		- 平衡扩容
		- 消除单点瓶颈
	* 资源使用分析、SQL执行次数
	* 单点故障
		- 并发请求
		- 重复请求
		- 超量请求
		- 请求挤压
 - 其他
	* 局部配额、令牌
	* 幂等控制、操作日志
	* 并发控制
	 	- 经典方法(事务)
		- 乐观方法(减少事务使用时间)
		- 分布锁(生命周期、防止死锁)
	* 请求丢弃
	  过期就丢弃相应的请求
	* 时间控制
	  整体服务期限
	* 分布事务
     	- TCC模式
		  Try - Confirm -Cancle
		- 补偿模式
		  Do - 补偿

探寻架构设计中的第六感(新浪网)

李晓栋:新浪网研发中心架构部 技术经理

- QOS
- TCP/IP协议先天不足
 - 管理心得
 	* 集中管理
	* 监控报警
	* 负载分析
	* 服务配置
 - 原则
 	* 高性能
	* 高可靠性
	* 高可管理性
 - 流量快速分析
 	* MRTG、ARTU
	* netflow、sflow、SNMP、Sniffer(pfring)
	* payload、wireshark
 - 平台使用方法
   * tcpdump抓包
   * 上传pcap包
   * 选择分析条件
   * 输出分析结果
 - misc
 	* 交换机(prot-channel)
	* LVS特殊单臂解决方案
	* PK麻烦且变更不便
	* 利用iptables获取TCP端口流量统计
	* 网页挂马的JS?

淘宝开放平台架构设计与实践

岑文初: 淘宝网开放平台架构师

 - 异步交互、通知
	* 保持会话、支持异步(短信)
	* 异步延时(大数据管理信息)
	* 订阅关系维护、支持通知服务(系统间数据同步)
 - 服务分流与隔离
 	二级域名(某API) --> 软负载(LVS、7层包、HA) --> 软负载 + 虚拟服务组(图)
	上下文缓存
 - 本地缓存、远程缓存
 - 商业方面
 	* 流量收费(调用接口)
	* 插件分成

高可用分布式数据库系统架构实践(Oracle\Mysql等数据库)

陈吉平:淘宝网技术总监、首席DBA、DBA Manager、Oracle ACE

 - 分布式
  分布式存储(TFS)、分布式Cache(Caire)
 - 高可用之双机房架构
  Data Guard + Redo mirror
 - V3.0垂直扩展
   用户、商品...
   非核心数据使用MySQL
 - V4.0 水平扩展 - 读写分离
 - V4.0 水平扩展 - 水平拆分
 	* Scale Out
	* 压力动态平衡
	* 支持任何数据库
 - Amazon、S3、EC2、Simple DB
 - C1 读写分离
 	* 主库集中,读库水平分割
	* 写操作、部分重要读操作回主库
	* 读库故障可回主库
	* APP -> TDDL
	* 数据路由、数据复制
 - C2 水平分割
 	* 16DB 1024张表,单表16亿条记录
	* 避免无限制分表
	* 没有主数据库
 - 监控
 	* DB、Host
	* SNMP ? => Agent??

Mysql数据库性能优化实战

叶金荣:搜狐游戏高级MySQL DBA

 - 常用命令
  	*  vmstats
	   vmstatus -s n 3
	*  iostats
	*  pidstat
	*  mpstats
	*  top
	*  sar
 - 诊断方法
	* mysql slow query
	* show engine innodbstatus
	* profiling
	* mysql report
 - 杂项
 	* 禁用swap
	* micro slow补丁 可显示详细执行计划
	* mysqlsla
	* 数据库擅长的事情:存储数据 + 事务
	* query cache可适当降低,可通过profiling查看,太大会引发新问题
	* sending data值的设置
	  只查询需要的字段即可
	* freeing items
	* 关闭binlogs
	* ssd 文件系统优化
	* xfs文件系统存储单个大文件有优势
	* 静态编译mysql速度也会提升
	* DNS管理系统
	* innodb buffer
	* 5.0.77 higerreat版本
 - 一些引擎
  	* MySIAM
	* InnoDB
	* TukoDB
	* XtraDB
	* Memcache for MySQL
	* waffle Grid Project
 - InnoDB Plugin 1.1
 	* 可快速创建索引
	* 数据压缩
	* 可在线设置是否单表使用空间
 - misc
 	* OLTP/OLAP 应用类型
	* COUNT(*)将进行全表扫描、InnoDB的表推荐使用COUNT(PK)

update:

MySQL的事务嵌套

在使用MySQL时,印象中Innodb表无法进行事务之间的嵌套,其实是有条件的:同一个连接里的事务无法嵌套,但不同连接之间的事务却可以嵌套。

getMessage() . "\n";
}

try {
    $dbh->beginTransaction();
    if (true) {
        $dbh2->beginTransaction();
        $dbh2->commit();
    }
    $dbh->commit();
    echo "It's OK.\n";
} catch (Exception $e) {
    echo "Transaction Faild: " . $e->getMessage() . "\n";
}

?>


当然,如果使用不同的用户名连接数据库,也是一种方法。

导出导入数据表中部分记录的方法

今天犯了一个很低级的错误,通过命令行恢复一个mysqldump出来的很大的文件时,由于没有没有将它放到后台进行,运行几个小时之后突然由于超时而中断与远程服务器的连接了。幸好可以通过SQL语句导出导入部分记录的数据:

导出:

SELECT * FROM park_log WHERE pl_id > 51025594 INTO OUTFILE '/tmp/apps_park_log_51025594.txt';

导入:

 LOAD DATA INFILE '/data1/apps_park_log/xB' INTO TABLE park_log;

yejr曾经测试比较,LOAD DATA比导入SQL文件快,但由于LOAD DATA必须所有操作进行完之后才向数据库里写记录,所以有时候往往会感觉LOAD DATA比较慢。我刚操作一个数千万行的文件时,还以为程序没有工作而手动中止了。真是一个活生生的例子。

换用Drupal程序

操作远远没有想象中的复杂:先通过wordpress将原Blog内容导出为一个WXR格式的文件,然后通过Drupal的WordPress Import模块,点几下鼠标即可将wordpress的内容转移至durpal里。

为了简化url,这次干脆将drupal程序放到了网站的根目录,值得一提的是,转换前后blog的feed订阅地址都没有变,不知道是不是巧合。