Home mail me! Syndicate this site using RSS

Archive for MySQL


1146 – Table ‘mysql.proc’ doesn’t exist

如果MySQL升级到新的版本后,出现”1146 – Table ‘mysql.proc’ doesn’t exist”的错误,那么还需要升级一下系统表,可使用MySQL自带的mysql_fix_privilege_tables或mysql_upgrade命令来修复一下.

注:自5.0.19版本起,mysql_fix_privilege_tables已经被mysql_upgrade命令代替!

相关信息可访问:http://dev.mysql.com/doc/refman/5.0/en/mysql-fix-privilege-tables.html

MySQL Sandbox

如果想在一台服务器上安装多个MySQL服务的话,MySQL Sandbox是个不错的选择,相比较MySQL自带的mysqld_multi而言要方便不少。

mysqld_multi方式需要安装多次,并且需要对每个服务进行相应的配置,而MySQL Sandbox一个命令即可搞定。

这里有个MySQL Sandbox的PPT介绍:http://datacharmer.org/presentations/mysqluniv_2008/sandbox_2_0.html

感兴趣的朋友可以访问官方网站:https://launchpad.net/mysql-sandbox

High Availability with DRBD and Heartbeat Presentation

这是Chris Barber 发布在Twin Cities MySQL and PHP User Group上的演讲,演讲内容很不错,关于采用DRBD和Heartbeat结束架构的高可用性集群,非常适合数据库应用,感兴趣的朋友可以看看。

原文地址:http://www.cb1inc.com/2008/06/10/high-availability-with-drbd-and-heartbeat-presentation

[小技巧]MYSQL中查找重复记录

先来录入一些测试数据

CREATE TABLE news(
	ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	Title VARCHAR(255) NOT NULL,
	PRIMARY KEY(ID)
);
 
INSERT INTO news (Title) VALUES ('aaa');
INSERT INTO news (Title) VALUES ('aaa');
INSERT INTO news (Title) VALUES ('aaa');
INSERT INTO news (Title) VALUES ('bbb');
INSERT INTO news (Title) VALUES ('bbb');
INSERT INTO news (Title) VALUES ('ccc');

列出所有Title字段重复的记录

SELECT * FROM news WHERE Title IN (
	SELECT Title FROM news GROUP BY Title HAVING (COUNT(*)) >1
)

[小技巧]INSERT … ON DUPLICATE KEY UPDATE

MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。

例如ipstats表结构如下:

CREATE TABLE ipstats (
ip varchar(15) not null unique,
clicks smallint(5) unsigned not null default '0'
);

原本需要执行3条SQL语句,如下:

IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
    UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
} else {
    INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
}

而现在只需下面1条SQL语句即可完成:

INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

MySQL集群(NDB)安装脚本

Jim Dowling为我们写了一个安装和管理MySQL集群(MySQL Cluster)的BASH脚本,支持安装本地集群和分布式集群,提问式的安装方式,非常方便,相信每个人都很容易上手。

http://www.jimdowling.info/ndbinstaller-trac/wiki/DetailedLocalhostInstall这里以图文的方式介绍了这个脚本的整个安装过程。

更多资料请访问:http://www.jimdowling.info/ndbinstaller-trac/

安装脚本下载(右键另存为)

wget http://www.jimdowling.info/ndbinstaller/ndbinstaller.sh
# or
svn co http://www.jimdowling.info/ndbinstaller/

Howto change runtime variables without restart MySQL Server

比方说在一些实际生产环境中,想改个MYSQL的配置,但是又不想停止服务重起MYSQL,有什么办法呢?使用SET命令可以做到,请看下面几个例子:

1.设置key_buffer_size的大小为10M。

SET GLOBAL key_buffer_size = 10485760;

SET @@global.key_buffer_size = 10485760;

2.设置最大连接数为200

SET GLOBAL max_connections=200;

SET @@global.max_connections=200;

3.更改慢查询SQL日志时间

SET @@long_query_time=3;

要查看有哪些变量,可执行SHOW VARIABLES;获得。

MySQL 5.1新特性之事件调度器(Event Scheduler)

一、前言

自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。

事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。

在使用这个功能之前必须确保event_scheduler已开启,可执行

SET GLOBAL event_scheduler = 1;

SET GLOBAL event_scheduler = ON;

来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:

mysqld ... --event_scheduler=1

Read more…

GROUP_CONCAT()妙用

GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,具体可参考MySQL官方文挡:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

先来看一下这个函数的语法:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

下面就演示一下这个函数所带来的方便之处,首先建立一个学生选课表student_courses,并填充一些测试数据。
Read more…

MYSQL命令行导出XML格式数据

使用“-X”这个选项即可。

# mysql -X -u root -e "use mysql; select * from user;"

输出结果如下:

<?xml version="1.0"?>
 
<resultset statement="select * from user">
  <row>
        <field name="Host">localhost</field>
        <field name="User">root</field>
        <field name="Password"></field>
        <field name="Select_priv">Y</field>
        <field name="Insert_priv">Y</field>
        <field name="Update_priv">Y</field>
        <field name="Delete_priv">Y</field>
        <field name="Create_priv">Y</field>
        <field name="Drop_priv">Y</field>
        <field name="Reload_priv">Y</field>
        <field name="Shutdown_priv">Y</field>
        <field name="Process_priv">Y</field>
        <field name="File_priv">Y</field>
        <field name="Grant_priv">Y</field>
        <field name="References_priv">Y</field>
        <field name="Index_priv">Y</field>
        <field name="Alter_priv">Y</field>
        <field name="Show_db_priv">Y</field>
        <field name="Super_priv">Y</field>
        <field name="Create_tmp_table_priv">Y</field>
        <field name="Lock_tables_priv">Y</field>
        <field name="Execute_priv">Y</field>
        <field name="Repl_slave_priv">Y</field>
        <field name="Repl_client_priv">Y</field>
        <field name="Create_view_priv">Y</field>
        <field name="Show_view_priv">Y</field>
        <field name="Create_routine_priv">Y</field>
        <field name="Alter_routine_priv">Y</field>
        <field name="Create_user_priv">Y</field>
        <field name="ssl_type"></field>
        <field name="ssl_cipher"></field>
        <field name="x509_issuer"></field>
        <field name="x509_subject"></field>
        <field name="max_questions">0</field>
        <field name="max_updates">0</field>
        <field name="max_connections">0</field>
        <field name="max_user_connections">0</field>
  </row>
</resultset>

Next Page »