极湖

无不用其“极”

Subscribe to RSS feed

Posts tagged with "MySQL"

mysql 数据库备份脚本

,

以下脚本用于本机 mysql 数据库的备份。每个数据库保存一周的7个备份。
#!/bin/bash

# 备份路径
BACKDIR=/var/backup/mysql
mkdir -p $BACKDIR

# MySQL的root用户密码
ROOTPASS=password

# 取得数据库名列表
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`

# 取得星期几
WEEKDAY=`date +'%w'`

# 对各数据库进行备份
for dbname in $DBLIST
do
    [ $dbname = "mysql" ] && continue
    mysqldump -u root -p$ROOTPASS $dbname | gzip > $BACKDIR/$dbname.sql.$WEEKDAY.gz
done

Snow Leopard 下安装 MySQL 的两种方法

, ,

方法一: 用 homebrew

安装
$ brew install mysql
$ sudo vi /etc/my.cnf


输入以下内容并保存
[mysqld]
datadir=/usr/local/var/mysql/mysql
socket=/usr/local/var/mysql/mysql.sock
character-set-server=utf8
max_allowed_packet=8M

#This option makes InnoDB to store each created table into its own .ibd file.
innodb_file_per_table

[mysql]
default-character-set=utf8

[client]
socket=/usr/local/var/mysql/mysql.sock


初始化
$ unset TMPDIR
$ mysql_install_db --verbose --user=$USER --basedir="$(brew --prefix mysql)" --tmpdir=/tmp

( 注意:mysql 的 owner 用户是当前 user )

启动/停止
$ mysql.server start
$ mysql.server stop


若需自动启停
$ mkdir -p ~/Library/LaunchAgents
$ cp /usr/local/Cellar/mysql/5.1.54/com.mysql.mysqld.plist ~/Library/LaunchAgents
$ launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist


方法二: 用苹果二进制包

安装
$ wget http://www.opensource.apple.com/other/MySQL-54.binaries.tar.gz
$ tar -zxvf MySQL-54.binaries.tar.gz
$ cd MySQL-54.binaries
$ sudo tar -xzvf MySQL-54.root.tar.gz -C /


初始化
$ sudo mysql_install_db --verbose --user=mysql
( 注意:mysql 的 owner 用户是 mysql )

启动/停止
$ sudo ln -s /usr/share/mysql/mysql.server /usr/bin/mysql.server
$ sudo mysql.server start
$ sudo mysql.server stop


/etc/my.cnf 可参考 homebrew 的设置,注意 mysql 的路径。
一般来说,只要把 /usr/local 去掉就行了。

总结:
  • 两种安装方式都很容易。homebrew 方式在初始化数据库的时候容易出错。我第二次安装才成功。
  • 用homebrew安装很容易卸载,只须执行 brew uninstall mysql。用苹果官方二进制包安装,很难卸载,因为直接写文件到 /usr。

给 MySQL 增加 Sequence 管理功能

,

MySQL 有 AUTO_INCREMENT 可以很方便的实现字段自增长。不过 AUTO_INCREMENT 有以下缺点:
  • 一个表只能有一个自增长字段
  • 自增长字段必须绑定到某一个表
  • 实现自增长,须在插入记录时,用 NULL,或是不指定该字段的值

为此,有必要仿照 PostgreSQL,增加 Sequence 管理用的表格和函数。

代码:
-- Sequence 管理表
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
	name VARCHAR(50) NOT NULL,
	current_value INT NOT NULL,
	increment INT NOT NULL DEFAULT 1,
	PRIMARY KEY (name)
) ENGINE=InnoDB;

-- 取当前值的函数
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	DECLARE value INTEGER;
	SET value = 0;
	SELECT current_value INTO value
		FROM sequence
		WHERE name = seq_name;
	RETURN value;
END
$
DELIMITER ;

-- 取下一个值的函数
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	UPDATE sequence
		SET current_value = current_value + increment
		WHERE name = seq_name;
	RETURN currval(seq_name);
END
$
DELIMITER ;

-- 更新当前值的函数
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
	RETURNS INTEGER
	LANGUAGE SQL
	DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
	UPDATE sequence
		SET current_value = value
		WHERE name = seq_name;
	RETURN currval(seq_name);
END
$
DELIMITER ;

/*
-- 测试
INSERT INTO sequence VALUES ('TestSeq', 0, 1);
SELECT SETVAL('TestSeq', 10);
SELECT CURRVAL('TestSeq');
SELECT NEXTVAL('TestSeq');
*/


以上内容翻译整理自:
http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/

mysql 的表优化

很简单的一句话:
OPTIMIZE TABLE  表名;


大致和 PostgreSQL 的
VACUUM 表名;

相当。

让 Zend_Db 支持 MySQL 的 SQL_CALC_FOUND_ROWS

, ,

修改 Zend/Db/Select.php, 增加以下代码

const FOUND_ROWS     = 'foundrows'; 
const SQL_FOUND_ROWS = 'SQL_CALC_FOUND_ROWS'; 

protected static $_partsInit = array(
    self::FOUND_ROWS   => false,  
    ... ...
);

/**
 * Makes the query SELECT SQL_CALC_FOUND_ROWS.  
 *
 * @param bool $flag Whether or not add SQL_CALC_FOUND_ROWS to SELECT.
 * @return Zend_Db_Select This Zend_Db_Select object.
 */
public function foundRows($flag = true)
{
    $this->_parts[self::FOUND_ROWS] = (bool) $flag;
    return $this;
}

/**
 * Render FOUND_ROWS clause  
 *
 * @param string   $sql SQL query
 * @return string
 */
protected function _renderFoundRows($sql)
{
    if ($this->_parts[self::FOUND_ROWS]) {
        $sql .= ' ' . self::SQL_FOUND_ROWS;
    }

    return $sql;
}


以上代码的具体位置不再详述。

调用方法如下:

$select = $db->select()->foundRows()->from(
  ... ...
)->where(
  ... ...
);

$data = $db->fetchAll($select);

$stmt = $db->query("SELECT FOUND_ROWS() as cnt");
list($rec) = $stmt->fetchAll();
$count = $rec['cnt'];

MySQL下复制表格的方法

两步走:
CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;

这样做的好处是同时复制表格的主键等。

如果只是复制数据:
CREATE TABLE new_table AS SELECT * FROM original_table;

即可。

关于优化MySQL应对高访问网站的讨论

, , ,

原文: http://www-css.fnal.gov/dsg/external/freeware/mysqlTuning.html
翻译: 小白(又名 风子)

MySQL优化
关于优化MySQL应对高访问网站的讨论

Tim,
首席技术长官,DCS

MySQL设置,高并发连接
本人有一网站每天需要负责大约3000用户,每天长达5到7小时的在线工作。所以在繁忙时段,我们要为2000多并发用户提供服务。在PHP和MySQL的设置比较合理的前提下,即使是入门级的Intel平台的服务器,MySQL一样可以应对的很好。

首先是硬件需求
1. 最好可以将Apache/PHP和MySQL分开跑在两台独立的服务器上,Linux版本及分发不限
2. 尽量减少服务器的其他负载,将最多的资源留给Apache/PHP和MySQL服务

我正在使用的服务器配置如下:
1. Apache/PHP: 奔腾III, 600MHz, 512M内存
2. MySQL: 双奔腾III, 750MHz, 2G内存

如此有偏向的配置主要是因为数据库的负荷非常重。我们的网站为会员制的在线教学系统,只有登录以后才能使用其中的功能,而且内容高度自订化。学生可以在系统中访问属于本人的一整套服务,譬如课程,成绩卡,时间表等等。教师可在网站上在线创建课程,包括课文,语音材料(包括文本生成的音频材料)等等。

1) PHP 程序编写: 一定要使用持续连接!
从Apache/PHP到MySQL的通讯中,建立和关闭连接是一个非常大的开销。通过使用持续连接,大型的数据访问网站可以共享连接来交换数据,避免了载入每页时都要重复的连接请求。有鉴于用户每次点击都可能会产生一次连接,持续连接的左右是相当重要的。
确定使用mysql_pconnect来取代mysql_connect,同时在php.ini或者程序文件中的ini_set行应当做出相应的调整。

2) Apache设置(httpd.conf)。我们的网站进行了很多针对性的优化,经过多次试验对比,我们最终确定了一组参数。最终的结果使我们在top可以得到最大的CPU空闲百分比。
MinSpareServers 10
MaxSpareServers 20
StartServers 70
MaxClients 255

3) Mysql设置(my.cnf)。在MySQL的配置文件重,我们在[mysqld]模块中加入了如下内容
set-variable = max_connections = 300
(这个数字必须大于Apache的MaxClients,否则Apache将无法充分利用连接)
set-variable = max_user_connections = 300
set-variable = table_cacle = 1200
(在数据库查询中可能发生的最多join表数量乘以max_user_connections)
在如上的参数重,max_connections和max_user_connections为我们提供稳定的服务提供了巨大的帮助。当Apache/PHP连接MySQL服务器时会被作为单用户来对待,MySQL默认并发连接数为1(译者注,鉴于原文撰写时间较早,当时的数据库默认配置较为保守。译者特地检查MySQL 5.0.32的默认位置文件,发现默认并发连接数已经提高到100,对于中小型网站来说已经游刃有余。不过网管对于这个参数的作用还是应当了然于胸的)。通过修改max_connections,使得Apache/PHP可以产生大量的持续连接。当Apache启动时,大量的并发连接已经就绪,之后的访问都可以利用这条通路来交换数据,从而大大的节约了建立连接时的系统开销。

一些MySQL的其他技巧
set-variable = max_allowed_packet = 1M (数据健壮性检查,防止失控查询)
set-variable = max_connect_errors = 999999 (防止mysqld因为过多的连接错误而重启)

译者注: 本文原创于2003年,当时的网络条件和硬件条件和如今已经有了比较大的区别,软件配置也有了相当的变化,譬如set-variable在MySQL 4.0.2以后已经可以省略。所以本文仅供参考,为有志于深入了解Apache MySQL的管理员新手们提供一点辅助的参考资料,切莫生搬硬套。

几条常用的Mysql命令

,

建库
create database `mydb` default character set utf8 collate utf8_general_ci;
grant all privileges on mydb.* to mydb_user@'localhost' identified by "mydb_pass";
grant all privileges on mydb.* to mydb_user@'%' identified by "mydb_pass";

设置密码
set password for 'root'@'localhost' = old_password('root_pass');
set password for 'mydb_user'@'localhost' = old_password('mydb_pass');
set password for 'mydb_user'@'%' = old_password('mydb_pass');

备份
# mysqldump --default-character-set=utf8 -uroot --all-databses > alldb_dump.sql
# mysqldump -u mydb_user -p mydb_pass --compact --default-character-set=utf8 mydb > mydb_dump.sql

恢复
# mysql -u root -p --default-character-set=utf8 < alldb_dump.sql
# mysql -u mydb_user -p --default-character-set=utf8 mydb < mydb_dump.sql

MySQL和PostgreSQL性能调优参考

, ,

MySQL数据库的分析报告工具

,

在一个叫 Hack MySQL 的网站上,发现了一个 mysqlreport的Perl脚本,在MySQL服务器上运行该脚本,就能给你制作一份漂亮的MySQL运行情况报告,对于MySQL的性能分析以及调优很有帮助。

运行该脚本之前,可能需要修改的地方:

# Default values if nothing else
$mycnf{'host'} ||= 'localhost';
$mycnf{'port'} ||= 3306;
$mycnf{'socket'} ||= '/var/run/mysqld/mysqld.sock'; # Debian default
$mycnf{'user'} ||= $ENV{'USER'};

我只修改了其中关于socket文件的一句:

$mycnf{'socket'} ||= '/tmp/mysql.sock'; # Debian default

执行结果就出来了:

MySQL 4.1.16-log uptime 12 13:20:50 Thu Feb 8 11:10:26 2007

__ Key _________________________________________________________________
Buffer used 372.00k of 16.00M %Used: 2.27
Current 1.86M %Usage: 11.62
Write ratio 0.000
Read ratio 0.012

__ Questions ___________________________________________________________
Total 2.40M 2.2/s
Slow 0 0/s %Total: 0.00 %DMS: 0.00
DMS 540 0.0/s 0.02

__ Table Locks _________________________________________________________
Waited 0 0/s %Total: 0.00
Immediate 540 0.0/s

__ Tables ______________________________________________________________
Open 7 of 64 %Cache: 10.94
Opened 7 0.0/s

__ Connections _________________________________________________________
Max used 3 of 100 %Max: 3.00
Total 18.08k 0.0/s

__ Created Temp ________________________________________________________
Disk table 0 0/s
Table 0 0/s
File 0 0/s


February 2012
S M T W T F S
January 2012March 2012
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29