MariaDB初体验,安装测试

系统环境:CentOS 7
MariaDB版本:MariaDB 10.0.14
下载地址:http://mirrors.neusoft.edu.cn/mariadb/mariadb-10.0.14/source/mariadb-10.0.14.tar.gz
其他包地址:https://downloads.mariadb.org/

添加一个mysql用户

useradd mysql

开始编译安装MariaDB

wget http://mirrors.neusoft.edu.cn/mariadb/cmariadb-10.0.14/source/mariadb-10.0.14.tar.gz
tar zxvf mariadb-10.0.14.tar.gz
cd mariadb-10.0.14
cmake .
make
make install

chown -R mysql /usr/local/mysql/
scripts/mysql_install_db --user=mysql
/usr/local/mysql/bin/mysqld_safe --user=mysql &

启动如果报错,应该是MariaDB启动的时候要默认创建一些日志文件,或者运行相关的文件,但是没有创建,或者指定的目录不存在
通常是因为:
一. 在 /var/log/mariadb/ 里创建 mariadb.log 文件没有权限
二. 在 /var/run/mariadb 里创建 mariadb.pid 也没有权限

那么我们分别要创建两个目录

mkdir /var/log/mariadb
mkdir /var/run/mariadb
chown mysql -R /var/run/mariadb #所有权给mysql用户,否则不能创建/var/run/mariadb/mariadb.pid文件

当然以上配置均可以修改,my.cnf配置文件来修改其位置

修改root用户密码:

/usr/local/mysql/bin/mysqladmin -u root password '123456'

其他可能会碰到的问题
1. mysql客户端启动不了
修改/etc/my.cnf

[mysql]
socket=/var/lib/mysql/mysql.sock

2. ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
此错误是因为socket位置导致, 加个软链, 当然修改/etc/my.cnf的sock位置也可以

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

官方编译帮助参考:https://mariadb.com/kb/en/mariadb/documentation/getting-started/compiling-mariadb-from-source/generic-build-instructions/

php安装oracle拓展,php安装oci8,php连接oracle数据库

本文主要叙述,php环境与oracle数据库不在同一台服务器上时,php环境的安装编译

按照官方说明文档 http://cn2.php.net/manual/zh/oci8.installation.php
编译php的时候要加上这个参数–with-oci8,但是加这个参数有个前提,就是必须要安装了对应的库文件。

安装库文件有两种方法:
一. 你的php环境和oracle在同一台服务器上(通常oracle都很大,这方法不合适)
二. 在你的php服务器上安装 Oracle Instant Client libraries.(这个方法适合php与oracle不在一个服务器上)

Oracle Instant Client libraries的安装步骤:详见 这里
1. 针对自己的系统下载适合的Instant Client packages安装包。其中安装包都需要Basic或者Basic Lite包(根据本链接选择一个系统平台,然后进去下载对应的Basic或者SDK等等包)
这里我下载了三个zip的包,分别是:
Instant Client Package – Basic
Instant Client Package – SQL*Plus
Instant Client Package – SDK

2. 解压包到一个单独的目录,比如 “instantclient”.(我把上述三个包放到一起,然后放到了/usr/local/instantclient)

3. 在环境变量里设置库的加载路径,路径为第二部设置的路径”instantclient”。多数UNIX平台环境变量设置LD_LIBRARY_PATH,而Windows系统应该用PATH

4. 可以开始你的应用了

加载库(上述第3步骤,环境变量)
上述所述的库,需要加载到linux系统才可以,那怎么加载呢
方法一:
编辑 /etc/ld.so.conf,在里面加入一行库文件路径/usr/local/instantclient(根据实际情况而定)
注意:centos的/etc/ld.so.conf文件里是用include包含加载了/etc/ld.so.conf.d/*.conf所有文件,所以我们可以创建一个文件/etc/ld.so.conf.d/oracle.conf,在里面加入一行库文件路径/usr/local/instantclient(根据实际情况而定),而不是直接编辑/etc/ld.so.conf文件。

方法二:
设置Linux系统设置环境变量

vim ~/.bashrc

最后一行加入

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/instantclient

此处根据实际情况修改,因为上述第二步的instantclient位置放到了/usr/local/instantclient

编译PHP
如果是编译安装php则需要加上 –with-oci8参数,因为我把Instant Client packages放在了/usr/local/instantclient
所以–with-oci8参数可以这样写
–with-oci8=shared,instantclient,/usr/local/instantclient
php实例编译如下:

./configure --prefix=/usr/local/php-5.3 --with-config-file-path=/usr/local/php-5.3/etc --with-config-file-scan-dir=/usr/local/php-5.3/etc/php.d --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-openssl --enable-soap --enable-safe-mode --enable-zip --with-oci8=shared,instantclient,/usr/local/instantclient

php官方实例,这样写的./configure –with-oci8=shared,instantclient,/usr/lib/oracle//client/lib
编译时如提示找不到libclntsh.so,可以加个软链

ln -s /usr/local/instantclient/libclntsh.so.12.1 /usr/local/instantclient/libclntsh.so

安装oci8拓展
使用php的pecl安装拓展

./pecl install oci8
在提示输入,Instant Client packages库的路径时候录入实际路径,此处录入:

shared,instantclient,/usr/local/instantclient

 

[root@localhost bin]# ./pecl install oci8
downloading oci8-2.0.8.tgz ...
Starting to download oci8-2.0.8.tgz (190,854 bytes)
.........................................done: 190,854 bytes
11 source files, building
WARNING: php_bin /usr/local/php-5.3/bin/php appears to have a suffix -5.3/bin/php, but config variable php_suffix does not match
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] : shared,instantclient,/usr/local/instantclient

最后把oci8加入php.ini

extension=oci8.so

查看phpinfo
F308B13D-63F7-4AF1-8967-D81978643B67

TmongoDB 简单快速实用的mongodb class,mongodb操作类, mongo 类

TmongoDB 是一个用PHP开发的快速易于使用的 mongodb操作类
主要特点是:
1.快速轻量级
2.易于使用 不管你多笨
3.支持静态调用 操作更简单
4.未来还会支持主从数据库操作(后面我将会支持这方面的开发)
项目地址:https://github.com/thendfeel/TmongoDB
TmonoDB

最近研究了下mongodb相关的开源操作类,到是很多,比较出名的 比如 doctrine 的mongodb类
但是操作起来极其复杂,而且庞大,测试总感觉过去庞大影响响应速度。而轻量级的基本没有成形的好产品。
所以我决定自己开发一个mongodb的操作类,就这样TmongoDB诞生了
目前项目托管在github上 https://github.com/thendfeel/TmongoDB

而我们公司使用的是Shanty-Mongo,一个应用到zend框架上的类,我们把它移植到了yaf框架上
但是发现Shanty-Mongo本身还是有很多问题,比如插入数据的时候自动插入数据来源字段,实际上就是多插入了一个type字段 值为数据所在的模型文档
变态的是查询时候也会自动加入这个字段查询,问题随之而来。
1.夸模型查询由于自动加入type字段 导致不能查出结果
2.多加入的一个字段,占用存储,无太大实际作用。

redis专题 redis安装 phpredis客户端安装 redis的session存储 php拓展redis库安装

大家都知道noSQL 就是分关系数据库,光知道没用 学习才是硬道理,本文讲述redis的安装,redis php 的拓展库安装 已经用redis存储session
下载:http://www.redis.io/download
参考官方安装很简单

$ wget http://download.redis.io/releases/redis-2.6.16.tar.gz
$ tar xzf redis-2.6.16.tar.gz
$ cd redis-2.6.16
$ make

另外可用 make PREFIX=/usr/local/redis install 指定安装目录
说明:安装仅安装二进制文件,配置文件在安装目录

运行服务
配置文件要单拿出来,然后修改里面的 daemonize no 改为daemonize yes

./src/redis-server redis.conf

安装redis php拓展
官方推荐了几款php客户端拓展 其中Predis、phpredis都比较不错
推荐使用phpredis这个用C写的,采用模块式方式
PhpRedis项目地址:https://github.com/nicolasff/phpredis

我们把PhpRedis安装到/usr/local/phpredis

cd /usr/local/
git clone https://github.com/nicolasff/phpredis.git
cd phpredis
phpize
./configure
make && make install

一定要在phpredis目录里执行phpize
如果phpize报错

Can’t find PHP headers in /usr/include/php

则用yum install php-devel 解决(如果软件源里找不到php-devel 在安装个remi软件源)
在php.d配置目录里添加 redis.ini 目录通常在/etc/php.d/
添加内容

extension=redis.so

然后保存为redis.ini文件 重启服务器
当执行php中的phpinfo()方法会看到redis已经在里面了

用redis存储session
我觉着这是一个比较实用的功能,大数据量 集群架构,导致web前端服务器生成的session存储在不同位置,而客户端每次访问 都可能被分配到不同的web服务器上 这样不能保证session,或导致第一次登陆了,再刷新就退出了
那我们可以把session存储在redis上,当然也可以存在memcache上
编辑 /etc/php.ini

session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"

session.save_path中host分别替换真实的服务器ip地址 其中weight是权重,比如示例中配置了三台 权重分别为1 2 2,那么就会把五分之一的用户分给host1,而host2 host3分别分配五分之二的请求
具体参考https://github.com/nicolasff/phpredis#php-session-handler

mysql慢查询记录,mysqlbinlog用法,详细mysqlbinlog配置,mysql log-bin设置

mysql可以记录所有查询很慢的记录并把sql语句记录在指定的文件中,也可以通过mysqlbinlog记录添加更新 等记录,也可以通过mysqlbinlog进行数据库还原。

mysql慢查询记录
编辑my.cnf文件
linux通常在/etc/my.cnf 或者/usr/local/mysql/etc/my.cnf
windows 自己找

在[mysqld]标签在下面加上:

log-slow-queries=/var/lib/mysql/slow.log #慢日志保存路径,该文件自己新建
long_query_time=2 #超过2秒的查询
;log-queries-not-using-indexes #记录没有使用索引的查询

开启mysql增量日志记录
同样在[mysqld]标签在下面加如下内容

log-bin=mysqlbin#名称随便取
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 256M
max_binlog_size = 1G#日志大小
expire_logs_days = 30#记录30天内的日志

mysqlbinlog的日志通常在/var/lib/mysql里面
日志一些简单的查询导出操作,其中mysqlbin.000001是里面的一个日志文件

mysqlbinlog --start-datetime="2013-09-10 00:00:00" --stop-datetime="2013-09-13 23:59:59" mysqlbin.000001 > /root/log.txt

还可以用这些记录来进行数据库还原

超强mysql语句转义,sql特殊字符转义,PK弱爆了的php mysql_escape_string

前一段时间发现公司数据库中存在大量的注入代码,都是因为对用户录入数据限制宽松导致,但是要根据这些东西查询的时候就会出现问题
当sql where 条件等于一串特殊符号时候 就容易报错,切断,甚至不执行,或者造成数据库危险。
下面我们简单测试下
创建测试数据

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', ''\\'''\\\'');

测试数据截图
20130804113740

如果我们通过这样的sql语句查询,是查不到的

select * from user where name = "'\'''\'"

必须要经过转义后才能查询,这样才能查询到结果

select * from user where name = "'\\'''\\\'"

有些人可能会想到用模糊查询比如like,但并不是一个很好的解决方案,导致查询不准确

那我们在执行sql之前要进行转义
但是 mysql_real_escape_string 和 mysql_escape_string 这样的转移函数 也并不是所有时候都靠谱。
这里我写了个php函数

function escape($sql_str) {
	$search = array('\', '/', '"', "'", '|', '-', ';', '[', ']');
	$replace = array('\\', '\/', '\"', "\'", '\|', '\-', '\;', '\[', '\]');
	return str_replace($search, $replace, $sql_str);
}

在执行sql前进行一次特殊符号转义即可
$sql = escape($sql);

MySQL GROUP BY 多个字段的解释

mysql语句中group by 很容易理解 是分组查询。
比如 select sum(score) from user group by name 意思是查询每个人的分数总和
但是, select sum(score) from user group by item, sex 呢?
下面是测试结果。

测试数据如下:
20130716104404

查询结果如下:
20130716104344

根据结果分析
group by 多个字段的含义是,分别以每个字段的不同组合分组
本例 item=数学 sex=1 和 item=数学 sex=2 就会分到不同组中,以此达到计算和目的

redis安装测试与常用方法使用教程 非关系数据库 nosql之redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
  Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

性能测试结果:
SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:

redis安装非常简单

$ wget http://redis.googlecode.com/files/redis-2.6.7.tar.gz
$ tar xzf redis-2.6.7.tar.gz
$ cd redis-2.6.7
$ make

如果其中报错如下,找不到make 是因为可能服务器版本的linux为最小安装,很多工具都没有安装

-bash: make: command not found

centos执行

yum install make

如果连wget也找不到

-bash: wget: command not found

centos执行

yum install wget

启动服务器

$ src/redis-server

启动显示:
redis

客户端使用

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

linux系统下mongodb报错src/mongo/shell/mongo.js:93 src/mongo/shell/mongo.js:91

linux执行命令连接mongodb:
#/usr/local/mongodb/bin/mongo localhost:41211/test

报错:
Error: couldn’t connect to server localhost:41211 src/mongo/shell/mongo.js:93

分析:
这里我指定了端口41211,src/mongo/shell/mongo.js:93 报错应该是端口错误,因为我是用默认的端口启动的mongodb
但是连接的时候却指定了41211端口所以报错。

如果 启动服务器的时候没有指定端口,那么连接的时候去掉端口参数即可,如:
#/usr/local/mongodb/bin/mongo localhost/test

另外还有报错
src/mongo/shell/mongo.js:91
这个错误多数是因为数据库路径找不到,可以指定下路径
linux下默认路径是 /data/db/

SQL语句转换Mongo对照表 sql mongo对应关系 SQL to Mongo Mapping Chart

下表为php官方提供的MongoDB与SQL语句对应关系表
SQL语句转换Mongo对照表 sql mongo对应关系 SQL to Mongo Mapping Chart

SQL to Mongo Mapping Chart

This is a PHP-specific version of the » SQL to Mongo mapping chart in the main docs.

SQL Statement Mongo Query Language Statement
CREATE TABLE USERS (a Number, b Number) Implicit or use MongoDB::createCollection().
INSERT INTO USERS VALUES(1,1) $db->users->insert(array(“a” => 1, “b” => 1));
SELECT a,b FROM users $db->users->find(array(), array(“a” => 1, “b” => 1));
SELECT * FROM users WHERE age=33 $db->users->find(array(“age” => 33));
SELECT a,b FROM users WHERE age=33 $db->users->find(array(“age” => 33), array(“a” => 1, “b” => 1));
SELECT a,b FROM users WHERE age=33 ORDER BY name $db->users->find(array(“age” => 33), array(“a” => 1, “b” => 1))->sort(array(“name” => 1));
SELECT * FROM users WHERE age>33 $db->users->find(array(“age” => array(‘$gt’ => 33)));
SELECT * FROM users WHERE age<33 $db->users->find(array(“age” => array(‘$lt’ => 33)));
SELECT * FROM users WHERE name LIKE “%Joe%” $db->users->find(array(“name” => new MongoRegex(“/Joe/”)));
SELECT * FROM users WHERE name LIKE “Joe%” $db->users->find(array(“name” => new MongoRegex(“/^Joe/”)));
SELECT * FROM users WHERE age>33 AND age<=40 $db->users->find(array(“age” => array(‘$gt’ => 33, ‘$lte’ => 40)));
SELECT * FROM users ORDER BY name DESC $db->users->find()->sort(array(“name” => -1));
CREATE INDEX myindexname ON users(name) $db->users->ensureIndex(array(“name” => 1));
CREATE INDEX myindexname ON users(name,ts DESC) $db->users->ensureIndex(array(“name” => 1, “ts” => -1));
SELECT * FROM users WHERE a=1 and b=’q’ $db->users->find(array(“a” => 1, “b” => “q”));
SELECT * FROM users LIMIT 10 SKIP 20 $db->users->find()->limit(10)->skip(20);
SELECT * FROM users WHERE a=1 or b=2 $db->users->find(array(‘$or’ => array(array(“a” => 1), array(“b” => 2))));
SELECT * FROM users LIMIT 1 $db->users->find()->limit(1);
EXPLAIN SELECT * FROM users WHERE z=3 $db->users->find(array(“z” => 3))->explain()
SELECT DISTINCT last_name FROM users $db->command(array(“distinct” => “users”, “key” => “last_name”));
SELECT COUNT(*y) FROM users $db->users->count();
SELECT COUNT(*y) FROM users where AGE > 30 $db->users->find(array(“age” => array(‘$gt’ => 30)))->count();
SELECT COUNT(AGE) from users $db->users->find(array(“age” => array(‘$exists’ => true)))->count();
UPDATE users SET a=1 WHERE b=’q’ $db->users->update(array(“b” => “q”), array(‘$set’ => array(“a” => 1)));
UPDATE users SET a=a+2 WHERE b=’q’ $db->users->update(array(“b” => “q”), array(‘$inc’ => array(“a” => 2)));
DELETE FROM users WHERE z=”abc” $db->users->remove(array(“z” => “abc”));

原文地址:http://us.php.net/manual/en/mongo.sqltomongo.php