标签归档:mysql

RSS feed of mysql

最后更新于 .

之前在文章里面有提到过,很多事情,并没有绝对的对错,只是度的问题。而度的衡量又取决于时、势二字。所以当形势逼人的时候,基本就是这件事情非做不可的时候了。

先说下背景,公司的服务器一直用的阿里云,包括mysql、redis也都是买了ECS自己搭建的。这里面有几个原因:

  1. 创业的时候,阿里云只提供mysql的存储,redis的存储还没提供。
  2. 没钱,即时现在去看redis的存储价格也是贵的吓人。

这样自己来搞存储有好处也有坏处。 好处:

  1. 完全可控,比如连接数限制,内存限制,存储限制。还有数据备份的灵活性等等。
  2. 强迫团队服务器研发要有存储运维能力。
  3. 省钱

坏处:

  1. 冷备、热备方案不完善。
  2. 存储运维的成本较高,需要长时间积累。

ok,问题就是这样,接下来再来说一下我们之前的冷备和热备方案。 可以说极其简陋:

  1. mysql、redis每天10点冷备,备份到本地磁盘和阿里云OSS
  2. redis使用rdb落地,每60秒至少有1次写就会触发落地。

这样做的问题其实挺多的,主要几个:

  1. mysql dump的时候会导致游戏卡顿,即使加了 --single-transaction 参数 也仅仅是缓解
  2. 冷备频率过低,真出现问题数据已经太久
  3. 没有热备,风险较大

针对这些问题,我们先做了mysql备份的优化 ...

最后更新于 .

前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做)

这篇还是一些技术的整理,主要是用于备忘,大家如果觉得太简单就一笑而过啦~

一. python通过图片内容判断图片类型

前段时间写了一个小站练手,http://xiangshuguo.com,一个支持自由上传的图片小站。

因为要限制上传图片的格式,所以要做文件类型检测,代码如下:


def get_image_type(pd, is_path=True):
'''
获取图片的类型,支持传入路径和文件内容
'''
if is_path:
f = file(pd, 'rb')
data = f.read(10).encode('hex')
else:
data = pd.encode('hex')

ftype = None

if data.startswith('ffd8'):
ftype = 'jpeg'
if data.startswith('424d ...

最后更新于 .

上一篇文章《更简洁的C++数据库访问框架-soci》介绍了soci,但也同时提到了一个缺点---insert/update/delete操作的时候,没有返回影响了多少行。
另外还有一个隐性的原因,soci的代码大量使用了异常,而项目中要求底层代码是严禁抛出异常的(其实google也是有这个要求的)。
基于以上两个原因,所以最终没有把soci用在生产环境。

但是又不想每次都重复去调用那些繁琐的MySQL API,所以这次又重新对MySQL API做了一层C++的封装。

其实相信每个和mysql打过交道的程序员都应该会尝试去封装一套mysql的接口,这一次的封装已经记不清是我第几次了,但是每一次我希望都能做的比上次更好,更容易使用。

先来说一下这次的封装,遵守了几个原则,其中部分思想是从python借鉴过来的:


  • 1.简单

  • 简单,意味着不为了微小的效率提升,而去把接口搞的复杂。因为本身数据库存储效率的瓶颈并不是那一两次内存copy,代码中随处可以看到以这个为依据的设计。
  • 2.低学习成本

  • 使用一套新库通常意味着投入学习成本,而这次的封装并没有像django那样实现一套完整的模型系统,也没有做soci那样的语法分析器,我选择最简单易懂的方式:做sql语句拼接器,所以对习惯了使用原生mysql api的朋友,学习成本很低
  • 3.模块化

  • 代码实际包括了两个模块,一个是mysql client端的封装,一个是sql的拼接器,这两个模块是完全独立的,调用者可以任意组合或者独立使用。
  • 4.尽量使用STL以及模板,简化代码编写

  • 最大的特点就是大量使用了stringstream进行类型转化 ...

最后更新于 .

一直以来,笔者都在不停寻找一种更人性化的数据库访问方式(并不是说默认的方式不好,而是有时候的确在模块化设计中不太方便)。 后来有幸在php中找到codeigniter的ActiveReord,详细参考这篇文章: 抽离CodeIgniter的数据库访问类! 然而c++却始终用着最原始的方式,昨天趁着项目要用的机会,在网上搜索了好久,总算让我找到两套c++的数据库访问框架:

两套代码我都拿下来看了一下,litesql实现了一套完整的代码自动生成,功能强大,但是也很重;soci相对要轻量,但是同样也实现了数据结构到数据库表的映射。本人还是比较喜欢轻量的东西,所以最终选择了soci。经过这两天的试用,感觉非常不错。 官方的文档也很详细,所以这里就用我写的单元测试代码来做一下简单的讲解:

首先创建库表:

create database soci;
CREATE TABLE `tb_test` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(32) default "",
  `sex` int(11) default 0,
  PRIMARY KEY  (`id`),
  UNIQUE ...

最后更新于 .

之前用mysql的时候一直是在用短链接,调用mysql_store_result获取一次数据之后就直接调用:


mysql_free_result(m_result);
mysql_close(m_Database);

但是有两个问题:

1.当使用长连接时(即connect之后一直不close),如果最后会调用mysql_close,需不需要每次都调用mysql_free_result呢?

2.当mysql_close调用之后,m_result的数据是否还可以用。

先说一下结论:
1.必须每次调用。因为经过测试,每次mysql_store_result的指针都是不同的,可见并不是共享了同一块buf。

2.还是可以使用。经过valgrind扫描,只调用mysql_close的扫描结果是:


==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5
==9397== at 0x40219B3: malloc (vg_replace_malloc.c:195)
==9397== by ...

最后更新于 .

最近因为python升级到了2.7导致mod_python不能用,所以自己电脑上的apache一直启动不起来,趁着周末有时间,抓紧搞一下。
在网上搜了一下,发现mod_python已经停止维护了,而替代他的是mod_wsgi,下载路径如下:
http://code.google.com/p/modwsgi/downloads/list
挑选For 2.7的版本下载,改名成mod_wsgi.so,然后扔到apache的modules目录就可以了。
在apache的conf文件中加入:


LoadModule wsgi_module modules/mod_wsgi.so

OK,但是我们真正的安装才刚刚开始。
刚才说过由于python升级到2.7,之前所有的库都删掉了,所以不得不重新安装,需要准备好如下库。

最后更新于 .

1.创建列


alter table tablename add colname type not null default '0';
例:
alter table mmanapp_mmanmedia add appid_id integer not null default 372;

2.删除列


alter table tablename drop column colname;
例:
alter table mmanapp_mmanmedia drop column appid_id;

3.在已经存在的列上创建外键关联


ALTER TABLE yourtablename    ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)    REFERENCES tbl_name (index_col_name, ...)    [ON DELETE ...

最后更新于 .

最近一直在思考,如果又那么多需求需要在vim里面调试gdb,执行python文件,链接数据库,与其每一个都去用vim脚本实现,为什么不直接把终端所有操作接管呢?

然后我去了www.vim.org的首页,然后,我居然真的看到了这个插件:
Conque Shell
下载链接:http://www.vim.org/scripts/script.php?script_id=2771
这个插件目前的评分是 Rating 447/122, Downloaded by 1280 ,也就是差不多每个评分的人都是4分(Life Changing!),而我也是毫不犹豫的选择了这个选项。

废话不多说,先来上图,对,你没有看错,这真的是vim.
在vim中打开bash:

  bash  
在vim中连接mysql:

mysql
在vim中打开python解释器:

python

哈哈,怎么样~~,是不是真的很酷!,OK,还有两张图,我们在最后再贴出来。来看一下这个插件的详细信息吧

一.简介 ...

最后更新于 .

这是我们 在windows下搭建mysql,php,apache环境 系列的最后一章,即《在windows下搭建mysql,php,apache环境(4)-wordpress的部署》
(欢迎查看前三章::《在windows下搭建mysql,php,apache环境(1)-mysql的部署》 《在windows下搭建mysql,php,apache环境(2)-php的部署》《在windows下搭建mysql,php,apache环境(3)-apache的部署》)

其实在前三章里,我们已经成功的搭建了mysql+php+apache的环境了,之所以要讲一下wordpress的部署,只是为了真正测试一下这个环境的可用性,同时也给那些想要搭建wordpress的朋友一个例子。

四.wordpress部署
    (1)安装
    a)下载wordpress最新版本,并将文件copy到C:\Program Files\Apache Software Foundation\Apache2.2\htdocs下。
    b)在命令行,mysql -u root -p ...

最后更新于 .

现在我们进行 在windows下搭建mysql,php,apache环境 的第三篇,在windows下部署apache(前两篇如下:《在windows下搭建mysql,php,apache环境(1)-mysql的部署》 《在windows下搭建mysql,php,apache环境(2)-php的部署》),这一章担负着整合php+mysql+apache的重任,所以十分重要 三.apache     (1)安装         双击运行 Snap17         确认同意软件安装使用许可条例,选择“I accept the terms in the license agreement”,点“Next”继续 Snap18         设置系统信息,在Network Domain下填入您的域名(比如:vimer.cn),在Server Name下填入您的服务器名称(比如:www.dantezhu-pc.vimer.cn,也就是主机名加上域名),在Administrator's ...