数据库学习

codesmith连接mysql需要下载MySql.Data.dll文件
下载地址是http://dev.mysql.com/downloads/connector/net/5.1.html

codesmith连接mysql我用时好像只能自己填写Connection String,不能点高级设置,附上个连接串实例:
Database=test;Data Source=127.0.0.1;User Id=root;Password=123456

然后测试看是否连接上,完成!

转自
lunzi   2012-03-06 12:33:35 阅读:656  评论:0  引用:0
1、开始——>Microsoft SQL Server 2008——>配置工具——>Sql Server 配置管理器——>      DIABLO(数据库实例)的协议中看看TCP/IP协议是否启动,如果启动,右键菜单点"属性" ,在IP地址页菜单中选"IP地址",把"IP1"和"IP2"中"TCP端口"为1433,"已启用"改为"是"

2、开始——>Microsoft SQL Server 2008——>配置工具——>Sql Server 配置管理器——>       SQL Native Client 10.0 配置——>客户端协议——>TCP/IP
选择TCP/IP右键菜单中"属性",确认"默认端口"是1433,"已启用"为"是"

以上操作完成后,在SQL Server 服务中重启SQL Server (DIABLO)。

转载
lunzi   2012-02-05 15:31:03 阅读:1943  评论:1  引用:0
mysql直接导入指定格式的文本数据,在做数据统计时比较有用,可以把分析好的日志,一次入库。
1、建立测试表test
CREATE TABLE `test` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `title` varchar(60) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、准备测试的文本文件log.txt
lunzi title
haohao title

3、LOAD DATA LOCAL INFILE 'e:/log.txt' into table test fields terminated by ' ';

按三步执行数据就可以进入test表
lunzi   2011-05-27 10:22:43 阅读:877  评论:1  引用:0
ALTER TABLE  表名   AUTO_INCREMENT=n
n代表从几开始
lunzi   2011-03-04 21:37:41 阅读:1816  评论:0  引用:0
CREATE TABLE part_tab
          ( c1 int default NULL,
     c2 varchar(30) default NULL,
     c3 date default NULL
    
          ) engine=myisam
          PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),
          PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,
          PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,
          PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,
          PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,
          PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),
          PARTITION p11 VALUES LESS THAN MAXVALUE );



create table no_part_tab
     (c1 int(11) default NULL,
     c2 varchar(30) default NULL,
     c3 date default NULL) engine=myisam;



CREATE PROCEDURE load_part_tab()
     begin
     declare v int default 0;
              while v < 8000000
     do
     insert into part_tab
     values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
     set v = v + 1;
     end while;
     end;
    

call load_part_tab();

insert into no_part_tab select * from part_tab;

select count(*) from no_part_tab where  c3 > date '1995-01-01' and c3 < date '1995-12-31';

select count(*) from part_tab where  c3 > date '1995-01-01' and c3 < date '1995-12-31';




二、
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)

PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
lunzi   2010-12-26 02:09:49 阅读:356  评论:1  引用:0
错误提示:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

解决办法:
set global log_bin_trust_function_creators = 1

原因:
log_bin_trust_function_creators参数缺省0,是不允许function的同步的
lunzi   2010-12-24 01:22:20 阅读:671  评论:0  引用:0
mysql InnoDB支持四类事务隔离级别,同时还支持一致性读操作,也就是单独的select语句不受事务影响,不会对数据库记录加锁,除非是在serializable级别,该语句会默认转为select ... lock in share mode; 在这种模式下会对数据库表加意向共享锁,同时对单独的记录加共享锁。

在mysql中只有两种select语句加锁,select ... lock in share mode;和select ... for update;第一个是对表加意向共享锁,对记录索引加共享锁,第二类是对表加意向排他锁,对记录索引加排他锁。

转自
lunzi   2010-12-17 00:20:08 阅读:573  评论:1  引用:0
1、分库分表

很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子:

<?php
for($i=0;$i< 100; $i++ ){
//echo "CREATE TABLE db2.members{$i} LIKE db1.members<br>";
echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}<br>";
}
?>


2、不停机修改mysql表结构

同样还是members表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,同事使用了下面的方法来处理:

先创建一个临时表:

/*创建临时表*/
CREATE TABLE members_tmp LIKE members
然后修改members_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,mid是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了
接着重命名将新表替换上去:

/*这是个颇为经典的语句哈*/
RENAME TABLE members TO members_bak,members_tmp TO members;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧。经过这个操作,使得原先8G多的表,一下子变成了2G多

转自
lunzi   2010-12-13 03:15:52 阅读:1947  评论:2  引用:0
1、一台机器上装了两个版本不同的mysql数据库来实现,5.1版本做master,5.0的版本做slave来实现主从备份。

2、5.1端口用的3307,5.0端口用的3308.

在Master(Mysql5.1)的数据库中建立一个备份帐户,命令如下
  
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'localhost' IDENTIFIED BY '654321';


3、Master 为Mysql5.1 修改如下(my.ini):
加在文件的最后就可以,

[mysqld]
  #Master start
  #日志输出地址 主要同步使用
  log-bin=C:/ProgramData/MySQL/MySQL Server 5.1/Data/log-bin.log
  #同步数据库
  binlog-do-db=test
  #主机id 不能和从机id重复
  server-id=1
  #Master end

4、.Slave 为Mysql5.0 修改如下(my.ini):
同样把下列代码加到文件的底部即可,


[mysqld]
  #Slave start
  log-bin=D:/Program Files/MySQL/MySQL Server 5.0/Data/log-bin.log
  #从机id,区别于主机id
  server-id=2
  #主机ip,供从机连接主机用
  master-host=localhost
  #主机端口
  master-port=3307
  #刚才为从机复制主机数据新建的账号
  master-user=slave
  #刚才为从机复制主机数据新建的密码
  master-password=654321
  #重试间隔时间10秒
  master-connect-retry=10
  #需要同步的数据库
  replicate-do-db=test
  #启用从库日志,这样可以进行链式复制
  log-slave-updates
  #从库是否只读,0表示可读写,1表示只读
  read-only=1

  #只复制某个表
  #replicate-do-table=tablename                
  #只复制某些表(可用匹配符)
  #replicate-wild-do-table=tablename%
  #只复制某个库
  #replicate-do-db=dbname
  #不复制某个表
  #replicate-ignore-table=tablename
  #不复制某些表
  #replicate-wild-ignore-table=tablename%
  #不复制某个库
  #replicate-ignore-db=dbname
  #Slave end
5、查询当前主机数据库文件和位置
show master status;

6、


use test;
  
  CREATE TABLE `users` (
     `id` bigint(20) NOT NULL auto_increment,
     `name` varchar(255) default NULL,
     PRIMARY KEY  (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  insert users(name) values('jacky');


测试ok,可以正常工作。

参考
lunzi   2010-12-12 18:22:05 阅读:1327  评论:3  引用:0
mysql缺少return来退出存储过程
可以使用leave来退出存储过程
CREATE PROCEDURE `proname`(uid int,rid int,out errorno int,...)
top:BEGIN
....
leave top;
END;

参考
lunzi   2010-10-31 00:41:54 阅读:1049  评论:1  引用:0
Copyright@2004-2010 powered by YuLog