随笔-115  评论-56  文章-0  trackbacks-5
  2011年12月5日
单个修改所有者sql语句如下:
查询分析器输入:EXEC sp_changeobjectowner 'user.table', 'dbo'
user.table的意思为:所有者.表名,比如oblog.oblog_user,以前的语句表示将table这张表的所有者由
user改成dbo
批量修改所有者语句如下:
查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
即可把当面表的所有所有者换成dbo
 
批量修改视图和存储过程的存储过程:
CREATE   PROCEDURE   ChangeProcOwner  
@OldOwner as   NVARCHAR(128),
@NewOwner as   NVARCHAR(128)
AS  
   
DECLARE   @Name   as   NVARCHAR(128)    
DECLARE   @Owner as   NVARCHAR(128)  
DECLARE   @OwnerName as   NVARCHAR(128)  
   
DECLARE   curObject   CURSOR   FOR    
select 'Name' =   name,  
'Owner' =   user_name(uid)  
from   sysobjects  
where   user_name(uid)=@OldOwner   and   xtype='p'  
order   by   name  
   
OPEN     curObject  
FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner  
WHILE(@@FETCH_STATUS=0)  
BEGIN          
if   @Owner=@OldOwner    
begin  
set   @OwnerName   =   @OldOwner   +   '.'   +   rtrim(@Name)  
exec   sp_changeobjectowner   @OwnerName,   @NewOwner  
end  
   
FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner  
END  
   
close   curObject  
deallocate   curObject  
GO
执行 exec   ChangeProcOwner   'xx','dbo' --修改视图所有者要写上原所有者名
或者
exec   ChangeProcOwner   '?','dbo'
另找一别人的方法,修改视图跟存储过程很方便
--执行这个语句,就可以把当前库的所有表的所有者改为dbo
exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
单个修改表所有者
exec   sp_changeobjectowner   '要改的表名/存储过程名','dbo'
--如果是要用户表/存储过程/视图/触发器/自定义函数一齐改,则用游标(不要理会错误提示)
declare tb cursor local for
select 'sp_changeobjectowner ''['+replace(user_name(uid),']',']]')+'].['
+replace(name,']',']]')+']'',''dbo'''
from sysobjects
where xtype in('U','V','P','TR','FN','IF','TF') and status>=0
open tb
declare @s nvarchar(4000)
fetch tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch tb into @s
end
close tb
deallocate tb
go
1. sp_changeobjectowner
更改当前数据库中对象的所有者。
语法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
参数
[@objname =] 'object'
当前数据库中现有的表、视图或存储过程的名称。object 的数据类型为 nvarchar(517),没有默认值。object 可用现有对象所有者限定,格式为 existing_owner.object。
[@newowner =] 'owner'
即将成为对象的新所有者的安全帐户的名称。owner 的数据类型为 sysname,没有默认值。owner 必须是当前数据库中有效的 Microsoft? SQL Server? 用户或角色或 Microsoft Windows NT? 用户或组。指定 Windows NT 用户或组时,请指定 Windows NT 用户或组在数据库中已知的名称(用 sp_grantdbaccess 添加)。
返回代码值
0(成功)或 1(失败)
注释
对象所有者(或拥有对象的组或角色的成员)对对象有特殊的权限。对象所有者可以执行任何与对象有关的 Transact-SQL 语句(例如 Insert、Update、Delete、Select 或 EXECUTE),也可以管理对象的权限。
如果拥有对象的安全帐户必须要除去,但同时要保留该对象,请使用 sp_changeobjectowner 更改对象所有者。该过程从对象中删除所有现有权限。在运行 sp_changeobjectowner 之后,需要重新应用要保留的任何权限。
由于这个原因,建议在运行 sp_changeobjectowner 之前,编写现有权限的脚本。一旦更改了对象的所有权,可能要使用该脚本重新应用权限。在运行该脚本之前需要在权限脚本中修改对象所有者。有关编写数据库脚本的更多信息,请参见编写数据库文档和脚本。
可以使用 sp_changedbowner 更改数据库的所有者。
权限
只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色成员,或既是 db_ddladmin 固定数据库角色又是 db_securityadmin 固定数据库角色的成员,才能执行 sp_changeobjectowner。
示例
下面的示例将 authors 表的所有者改为 Corporate\GeorgeW。
EXEC sp_changeobjectowner 'authors', 'Corporate\GeorgeW'
请参见
改变数据库所有者:sp_changedbowner
------------------------------以上摘自sql server 的联机丛书
注意:
使用sqlserver2000改变对象(object)(如Table,SP,View)的所有者(owner)时,需要注意一点:
如果对象改变前的owner为dbo,则直接用:exec sp_changeobjectowner 对象名,新的所有者名就可以成功。如果再需要改变该对象的所有者,则要用如下语法:
exec sp_changeobjectowner "[所有者].[对象名]",新的所有者。注意,双引号不可省略,否则提示objectname does not exist。
EXEC sp_changeobjectowner 'cqadmin.authors', 111
2.建与原表结构相同表,然后把数据从原表插入到新表,操作方法:
在sql server企业管理器中选择原表点右键,选择“所有任务/生存SQL脚本”,保存生成的脚本,在脚本中把表的原所有者改成新所有者。然后再把该脚本运行一遍,数据库中就新生成了一个表,所有者是新所有者,原来的表还在数据库中没有被替换。新表和旧表表名相同,所有者不同,此时的新表中没有数据。
然后再运行下面的语句往新表中插入数据:
Insert INTO CQAdmin.m_actiondef //新所有者.新表名
Select *
FROM RegaltecDefSchema. CQAdministrator.m_actiondef // 数据库名.旧所有者.旧表名
运行完了就做完了,可以把旧表删掉,也可以留着。
posted @ 2011-12-05 09:22 周国选 阅读(151) 评论(0) 编辑
  2011年9月23日

因为安装数据库,需要较大的磁盘容量,需要把一块新磁盘挂载到/opt上
1 对磁盘做分区:

root@rac1:/root>fdisk /dev/sdb
The number of cylinders for this disk is set to 182024.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-182024, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-182024, default 182024):
Using default value 182024
Command (m for help): p
Disk /dev/sdb: 1497.1 GB, 1497198755840 bytes
255 heads, 63 sectors/track, 182024 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 182024 1462107748+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

2 创建ext3 文件系统:
root@rac1:/root>mkfs.ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
182763520 inodes, 365526937 blocks
18276346 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
11155 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
3 创建标签
root@rac1:/root>e2label /dev/sdb1 /opt
root@rac1:/root>mount /dev/sdb1 /opt
4 mount 到/opt (如果opt里面有数据,则需要先做备份,mount之后,再拷贝到/opt目录)
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
/dev/sdb1 1.4T 198M 1.3T 1% /opt
5 修改/etc/fstab 文件
root@rac1:/root>vi /etc/fstab

LABEL=/ / ext3 defaults 1 1
LABEL=/tmp /tmp ext3 defaults 1 2
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda5 swap swap defaults 0 0
LABEL=/opt /opt ext3 defaults 1 2

"/etc/fstab" 11L, 761C written
测试:
root@rac1:/root>umount /opt/
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
root@rac1:/root>mount -a
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
/dev/sdb1 1.4T 198M 1.3T 1% /opt
root@rac1:/root>ls /opt/
lost+found
root@rac1:/root> 

posted @ 2011-09-23 16:11 周国选 阅读(59) 评论(0) 编辑
  2011年9月22日
年前把服务器重装了下,系统Centos5.4.主要做网站发布,装的apache服务。

当时做的时候因特殊原因,要改默认主页为 default.php,安装默认是 :DirectoryIndex  index.html

于是就修改 /etc/httpd/conf/httpd.conf 文件 DirectoryIndex  index.html 为 DirectoryIndex  default.php index.php index.html

重启服务器,无效!

查了一些资料,没有得到解决。应急的处理方法是在原index.php页面做一次跳转。

今天,因为网页流程上的一些问题,这个设置失效的bug显现出来,于是再次致力解决此问题。

最好的老师和技术指导任然是网络,我查了许多资料,一个下午,没有得到有效解决方案。

晚上回家,还是放不下,也不甘心。我来到服务器。

cd /etc/httpd/

发现我一直忽略了conf.d 文件夹,进入这个文件夹,可以看到很多配置文件,其中有一个就是php.conf

打开此文件,发现也有:DirectoryIndex  index.php 配置。

于是我怀疑 是这个文件的此配置覆盖了/etc/httpd/conf/httpd.conf 的配置

我试着把这句也改成DirectoryIndex  default.php index.php 。

重启apache:/etc/init.d/httpd restart

访问测试页面(自己写的:defult.php和index.php)成功访问defult.php..说明配置成功!


总结:

修改apache默认主页要修改两个文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d/php.conf

修改这两个文件的 DirectoryIndex  后的文件名。

posted @ 2011-09-22 16:37 周国选 阅读(590) 评论(0) 编辑

要想在linux上实现网页服务器(www)需要Apache这个服务器软件,不过Apache仅能提供最基本的静态网站数据而已,想要实现动态网站的话,最好还是要PHP与MySQL的支持,所以下面我们将会以LAMP(linux+Apache+MySQL+PHP)作为安装与设置的介绍。

LAMP所需软件与其结构
httpd mysql mysql-Server php php-devel php-mysql
可以用rpm包安装,或者直接用yum安装
#yum install httpd mysql-server php php-devel php-mysql
先来了解一下apache 2.0这个版本的相关结构,这样才能知道如何处理我们的网页数据
/etc/httpd/conf/httpd.conf:最主要的配置文件,不过很多其他的distribution都将这个文件拆成数个小文件,分别管理不同的参数。但是最主要配置文件还是以这个文件名为主。
/etc/httpd/conf.d/*.conf:这个事CentOS的特色之一,如果你不想修改原始配置文件httpd.conf的话,那么可以将你自己的额外参数独立出来,而启动apache时,这个文件就会被读入到主要配置文件。
/usr/lib/httpd/modules:apache支持很多的模块,所以您想要使用的模块默认都放置在此目录
/var/www/html:这里是CentOS默认的“首页”所在目录。
/var/www/error:如果因为主机设置错误,或者是浏览器端要求的数据错误,在浏览器上出现的错误信息就已这个目录的默认信息为主。
/var/www/icons:提供apache的一些小图标
/var/www/cgi-bin :默认给一些可执行的CGI程序放置的目录
/var/log/httpd:默认apache的日志文件都放在这里,对于流量大的网站来说,这个目录要很小心,因为这个文件很容易变的很大,您需要足够的空间哦
/usr/sbin/apachectl:这是Apache的主要执行文件,这个执行文件其实是shell script,它可以主动检测系统上的一些设置值,好让您启动Apache时更简单
/usr/sbin/httpd:这是主要的apache的二进制文件
/usr/bin/htpasswd:当您想登陆某些网页时,需要输入账号与密码。那么Apache本身就提供一个最基本的密码保护方式。该密码的产生就是通过这个命令实现的

至于MySQL方面,您需要知道的几个重要目录与文件有以下几个:
/etc/my.cnf:这是Mysql的配置文件,包括您想要进行mysql数据库的最佳化,或者是正对mysql进行一些额外的参数指定,都可以在这个文件里实现
/usr/lib/mysql:这个目录是MySQL数据库放置的位置,当启动任何MySQL的服务器时,请务必记得在备份时,将此目录完整的备份下来。

另外,在PHP方面,应该了解以下几个文件。
/usr/lib/httpd/modules/libphp4.so:PHP提供给apache使用的模块,这个关系我们能否在apache网页上面设计php程序语言的最重要文件
/etc/httpd/conf.d/php.conf:你要不要手动将该模块写入Httpd.conf中呢?不需要,因为系统已经主动将php设置参数写入到这个文件中了,而这个文件会在apache重新启动时被读入。
/etc/php.ini:这是PHP的主要配置文件,包括PHP能不能允许用户上传文件,能不能允许某些低安全性的标志等,都在这个配置文件中设置。
/etc/php.d/mysql.ini /usr/lib/php4/mysql.so:PHP能否可以支持MySQL接口就看这两个文件了。这两个文件是由php-mysql软件提供的
/usr/bin/phpize /usr/include/php:如果您以后想要安装类似PHP加速器可以让浏览速度加快的话,那么这个文件与目录就需要存在,否则加速器软件没法用。

httpd.conf的基本设置
首先,你需要在/etc/hosts内需要有个一个完整的主机名,否则在重启apache服务时,会提示找不到完整的主机名。
httpd.conf的基本设置是这样的:
<设置项目>
      次设置项目内的相关参数
      。。。。
</设置项目>
例如,你想要针对首页/var/www/html提供额外的功能,那么可以进行如下设置:
<Directory "/var/www/html">
   Options Indexes
   ......
</Directory>

针对主机环境的设置项目
#vi /etc/httpd/conf/httpd.conf
ServerTokens OS
# 这个项目在告诉客户端WWW服务器的版本和操作系统,不需要改编它
#如果你不想告诉太多的主机信息,将这个项目的OS改成Minor

ServerRoot "/etc/httpd"
#这个是设置文件的最顶层目录,通常使用绝对路径,下面某些数据设置使用相对路径时
#就是与这个目录设置值有关的下层目录,不需要更改它
ServerRoot
设定Apache 安装的绝对路径
TimeOut
设定 服务器接收至完成的最长等待时间
KeepAlive
设定服务器是否开启连续请求功能,真实服务器一般都要开启
Port
设定http服务的默认端口。
User/Group
设定 服务器程序的执行者与属组,这个一般是Apache

下面我们就针对Apache做几个实验
1:我们测试把默认网站目录改到root家目录下
新建/root/website目录
#mkdir -p /root/website
#echo "website page" >> /root/website/index.html
#vi /etc/httpd/conf/httpd.conf
找到 DocumentRoot "/var/www/html" 这一段   //apache的根目录
把/var/www/html 这个目录改到 /root/website
在找到 <Directory "/var/www/html"> //定义apache /var/www/html这个区域
把 /var/www/html改成/root/website
这样我们就把apahce的默认路径改掉了
然后重启服务
#service httpd restart  
//这里在你重启服务的时候,可能会报错,说找不到目录,这个主要是由于selinux导致的
那怎么解决呢?有2个办法,关掉selinux  
#setenforce 0
或者更改/root/website这个文件的selinux属性,让它匹配httpd这个服务器的要求
怎么改?我们可以复制/var/www/html这个目录的selinux属性
#chcon -R --reference /var/www/html /root/website
然后在重启服务,之后你就看到它没有报错了
不过你去访问localhost的时候,会发现访问拒绝 这是为什么呢?主要是因为你的/root的权限是750,ahache这个用户没有权限访问,你需要更改掉权限,可以这样改
#chmod -R 755 /root
然后去访问 发现正常了

2:基于名称的虚拟主机
需要两个域名解析到你的服务器,对应关系是
/var/www/server             server.example.com
/var/www/client                client.example.com
当访问这两个域名时,可以分别显示出不同文件里面主页的内容
#echo "server page" >> /var/www/server/index.html
#echo "client page" >> /var/www/client/index.html
然后我们编辑一个配置文件
#vi /etc/httpd/conf.d/virtual.conf //记住conf.d里面的内容也是apache的配置文件
添加如下内容:
NameVirtualHost 192.168.76.133:80

<VirtualHost 192.168.76.133:80>
ServerName service.example.com
DocumentRoot /var/www/server
</VirtualHost>

<VirtualHost 192.168.76.133:80>
ServerName client.example.com
DocumentRoot /var/www/client
</VirtualHost>
#service httpd restart
这样基于名称的虚拟主机就配置好了
如果你没有DNS你可以再你的机器上hosts文件里加记录 linux在/etc/hosts这个文件 windows在C:\windows\system32\drivers\etc\hosts文件
加上这两行
192.168.76.133    server.example.com
192.168.76.133    client.example.com
这样你在去测试,就会发现访问不同的域名显示不同的内容了 这样基于名称的虚拟主机就配置好了!

3:基于IP地址的虚拟主机
先添加一个临时网卡
#ifconfig eth0:0 192.168.76.132 //临时使用,重启后就会消失
然后便捷virtual.conf文件
#vi /etc/httpd/conf.d/virtual.conf
把内容修改为
#NameVirtualHost 192.168.76.133:80

<VirtualHost 192.168.76.133:80>
ServerName service.example.com
DocumentRoot /var/www/server
</VirtualHost>

<VirtualHost 192.168.76.132:80>
ServerName client.example.com
DocumentRoot /var/www/client
</VirtualHost>
让后你在用ip访问,发现也能显示不同的内容,或者你编辑hosts文件,用域名访问也没问题
这样基于IP地址的虚拟主机也成功了!

4:别名
在/etc/httpd/conf/httpd.conf里加入
Alias /test "/root/website/"    // 别名 这样你用192.168.76.133/test访问 也会显示192.168.76.133的页面
这个地方需要注意的就是/test 还是/test/ 这个是有区别的 你用/test 那么你访问的时候只能用192.168.76.133/test访问   如果你用/test/ 那么192.168.76.133/test/访问,而/test将不会让你访问
忘了这里你的先把/etc/httpd/conf.d目录里面刚刚设置的虚拟目录注释掉,不然没法访问,是因为做了虚拟目录,而httpd.conf里面的设置就无法访问 当然可以用localhost来访问,其他的访问都不行

5:实现网页的资源下载
首先添加别名
#vi /etc/httpd/conf/httpd.conf
在Alias /test "/root/website/" 后面加入
Alias /down "/var/ftp/pub"
让后对/var/ftp/pub区域设置参数
<Directory "/var/ftp/pub">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
在Options 加入 MultiViews   //没有index时自动列出目录文档
然后重启服务,这样http://192.168.76.133/down/里面就可以列出/var/ftp/pub里面的文件了,试着点一个另存为,是否可以下载? 呵呵 成功!

6:.htpasswd的实现
#vi /etc/httpd/conf/httpd.conf
我们针对刚刚做的/var/ftp/pub来做
加入如下信息
Alias /down "/var/ftp/pub/"
<Directory "/var/ftp/pub">
    Options Indexes MultiViews
    AllowOverride AuthConfig
    Order allow,deny
    Allow from all
</Directory>
<Directory "/var/ftp/pub">
AuthType Basic
AuthName "this is test"
AuthUserFile /etc/httpd/htpasswd
Require User test
</Directory>
然后重启httpd服务,
让后生成.htpasswd用户密码
htpasswd -c /etc/httpd/htpasswd test
让后去访问192.168.76.133/down会需要密码
这样就成功了

posted @ 2011-09-22 16:30 周国选 阅读(329) 评论(0) 编辑
  2011年9月14日

Fotolog 是一个以图片为主的 SNS 网站,让 VPSee 好奇的是用 Solaris 的 Web 2.0 站点不多,看看 Fotolog 有没有什么新东西。

数据

数据和图片来源(2007):Fotolog: Scaling the World’s Largest Photo Blogging Community

超过1100万用户
超过24亿条评论
每个月超过35亿 PV 和 2000万独立访问,Alexa Top 20
总共有超过2亿张的图片,每天还有超过50万张照片上传
20%用户每天在 Fotolog 停留 24分钟
32台 MySQL 服务器和一个由30台 memcached 服务器组成的集群

技术平台

Solaris 10
MySQL
Apache
Java / Hibernate
PHP
Memcached
3PAR
IBRIX
CDN

MySQL

32台 MySQL 服务器被分成4个集群:User, GB (guest book), PH (photos), FF (friends and favorites lists)。每个集群又被分成一个 shard 集,并由一个应用服务器集做前端。每个 shard 集包括若干个 MySQL 服务器,一个只写的 Master-Master 配几个只读的 Slaves,应用服务器把读请求发给 Slaves,把写请求发给 Master。MySQL 只存储图像的 metadata,没人想要把图像存到数据库里吧?什么是 metadata?metadata 是 “data about other data”,如一张照片的 metadata 就是一些包括:作者,年份,照片说明,摄影设备等信息就是这张照片的 metadata。

GB 集群的架构:

Fotolog 架构


 

 

 

 

 

 

 

 

 

 

 

 

 

GB 扩展后的架构:

Fotolog 架构

 

 

 

 

 

 

 

 

 

 

 

 

Fotolog 开始用的是 MyISAM 引擎,表结构:

CREATE TABLE `guestbook_v3` (
`identifier` bigint(20) unsigned NOT NULL auto_increment,
`user_name` varchar(16) NOT NULL default ”,
`photo_identifier` bigint(20) unsigned NOT NULL default ’0′,
`posted` datetime NOT NULL default ’0000-00-00 00:00:00′,

PRIMARY KEY (`identifier`),
KEY `guestbook_photo_id_posted_idx` (`photo_identifier`,`posted`)
) ENGINE=MyISAM

执行数据库查询的时候,需要6次磁盘 IO 从不同块读取数据:

Fotolog 架构

 

 

 

 

 

 

 

 

 

 

 

 

后来改成 InnoDB,表结构改成:

CREATE TABLE `guestbook_v4` (
`identifier` int(9) unsigned NOT NULL auto_increment,
`user_name` varchar(16) NOT NULL default ”,
`photo_identifier` int(9) unsigned NOT NULL default ’0′,
`posted` timestamp NOT NULL default ’0000-00-00 00:00:00′,

PRIMARY KEY (`photo_identifier`,`posted`,`identifier`),
KEY `identifier` (`identifier`)
) ENGINE=InnoDB 1 row in set (7.64 sec)

改成 InnoDB 后,只需要2次磁盘 IO 读取,大大减少了磁盘操作:

Fotolog 架构

 

 

 

 

 

 

 

 

 

 

 

 

InnoDB 是以 primary key 来存放数据到磁盘上的,而 MyISAM 是以插入数据的顺序来存放数据的,这样 InnoDB 有个潜在的好处就是如果以 primary key 来查询数据的话,磁盘 IO 操作就可以一次读取需要的数据(因为它们都在一起),不必像 MyISAM 那样从磁盘的不同位置执行多个 IO 操作来得到数据。简单的说就是 InnoDB 在查询的时候减少了磁盘 IO 操作的次数,从而获得了潜在的性能提升。Fotolog 正是利用了 InnoDB 的 这个优点。

3PAR 和 IBRIX

在DELL、EMC、日立、HP、IBM、NetApp、Sun等公司把持的存储市场,还能冒出个 3PAR 出来,显示了 3PAR 的特别和技术特色。3PAR 产品的主要技术是:分布式多态集群、虚拟化、自动精简配置、精简备份以及高性能 RAID 5,其中最突出的优势是自动精简配置。3PAR 在 Internet/Web 2.0 行业有几个重量级客户:myspace.com, ask.com, fotolog.com, shopzilla.com 等。

Fotolog CTO 解释了为什么用 3PAR:

With 3PAR Thin Provisioning, you set it up and walk away. As actual data is written, the system tells us when it needs more capacity—which is added simply and non-disruptively. With 3PAR, we’ve cut our monthly storage administration time from 40 hours to 30 minutes.

-Nathan Boeger
Director of Network Operations, Fotolog

IBRIX 是一家做文件服务器集群的存储公司,最近刚被 HP 收购,重量级客户有:AOL, Fotolog, RealNetworks, Disney, DreamWorks, 等。

Memcached Cluster

Fotolog 用50台 memcached 服务器连成一个集群,总共 cache 加起来差不多 150GB,能应付每个月40亿左右的 PV。使用 memcached 后,高峰时期网站 load 时间从 10秒降到2秒。Memcached 已经是动态网站的标配,LAMP 的 M 现在应该包括 MySQL 和 Memcached 了。

posted @ 2011-09-14 09:24 周国选 阅读(21) 评论(0) 编辑
  2011年9月13日

mysql> use dbname
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
让后就卡在这里。
 
 
上面卡住的原因::
       是由于数据库太大,即数据库中表非常多,所以如果预读数据库信息,将非常慢,所以就卡住了,如果数据库中表非常少,将不会出现问题。
          
出现问题的原因是::
       我们进入mysql 时,没有使用-A参数;
       即我们使用
           mysql -hhostname -uusername -ppassword -Pport 的方式进入数据,
       而没有使用
           mysql -hhostname -uusername -ppassword -Pport  -A的方式进入数据库。
 
          当我们打开数据库,即use   dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息。

posted @ 2011-09-13 17:40 周国选 阅读(65) 评论(0) 编辑

MySQL是开源的关系型数据库系统。复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程。

配置主服务器(master)

1、编辑数据库配置文件my.cnf,一般在/etc/目录下。

  1. #vi /etc/my.cnf

在[mysqld]的下面加入下面代码:

  1. log-bin=mysql-bin
  2. server-id=1
  3. innodb_flush_log_at_trx_commit=1
  4. sync_binlog=1
  5. binlog-do-db=wordpress
  6. binlog_ignore_db=mysql

server-id=1中的1可以任定义,只要是唯一的就行。
binlog-do-db=wordpress是表示只备份wordpress。
binlog_ignore_db=mysql表示忽略备份mysql。
不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。
2、然后重启MySQL:

  1. #service mysqld restart

3、登录MySQL服务器。

  1. #mysql -uroot -p

在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。在下面的命令,把X.X.X.X替换为从服务器的IP。

  1. mysql>CREATE USER 'user'@ 'X.X.X.X' IDENTIFIED BY 'password';
  2. mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password';

4、执行以下命令锁定数据库以防止写入数据。

  1. mysql>FLUSH TABLES WITH READ LOCK;

5、退出mysql命令行,导出数据库

  1. #mysqldump -u root -p123456 --all-databases  --lock-tables=false  -- > /root/all.sql

6、使用scp命令传输数据库文件all.sql到从服务器。

  1. #scp /root/all.sql root@www.example.com:/root

7、再次连接数据库进入mysql命令行查看master状态。

  1. mysql>SHOW MASTER STATUS;

请记下显示的信息,配置从服务器会用到。
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 1001741 | dbispconfig | mysql |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
8、解锁数据表。

  1. mysql>UNLOCK TABLES;

配置从服务器(slave)

登录从服务器。
1、导入主服务器的数据库。

  1. #mysql -u root -p123456 < /root/all.sql

2、编辑配置文件my.cnf,在[mysqld]下面加入:

  1. server-id=2

2可以自己定义,只要保证唯一的就行。
3、保存文件并重启mysqld。

  1. #service mysqld restart

4、登录mysql服务器,执行以下命令。

  1. mysql>CHANGE MASTER TO
  2. MASTER_HOST='X.X.X.X',
  3. MASTER_USER='user',
  4. MASTER_PASSWORD='password',
  5. MASTER_PORT=3306,
  6. MASTER_LOG_FILE='mysql-bin.000001',
  7. MASTER_LOG_POS=98,
  8. MASTER_CONNECT_RETRY=10;

MASTER_HOST:主服务器的IP。
MASTER_USER:配置主服务器时建立的用户名
MASTER_PASSWORD:用户密码
MASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可。
5、启动slave进程。

  1. mysql>START SLAVE;

6、查看mysql的日志,一般在/var/log/目录下的mysqld.log,如果启动成功,你应该会看到类似下面的日志。

[root@localhost ~]# vi /etc/my.cnf


091104 8:42:02 [Note] Slave I/O thread: connected to master ‘root@X.X.X.X:3306?, replication started in log ‘mysql-bin.000001? at position 98
现在主服务器和从服务器已经配置好了。另外你可能需要设置主服务器的数据库二进制日志的过期时间,可以在配置文件中使用参数expire_logs_days来设定。

 

posted @ 2011-09-13 16:03 周国选 阅读(166) 评论(0) 编辑
这两天搞个网站,又用到MySql,可是命令却一个都想不起来,所以,趁这次机会,把这些整理一下,权当作笔记吧,以便自己以后查阅!
1:使用SHOW语句找出在服务器上当前存在什么数据库:
  mysql> SHOW DATABASES;
2:2、创建一个数据库MYSQLDATA
  mysql> CREATE DATABASE MYSQLDATA;
3:选择你所创建的数据库
  mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的数据库中存在什么表
  mysql> SHOW TABLES;
5:创建一个数据库表
  mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
  mysql> DESCRIBE MYTABLE;
7:往表中加入记录
  mysql> insert into MYTABLE values ("hyq","M");
8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)
  mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;
9:导入.sql文件命令(例如D:/mysql.sql)
  mysql>use database;
  mysql>source d:/mysql.sql;
10:删除表
  mysql>drop TABLE MYTABLE;
11:清空表
  mysql>delete from MYTABLE;
12:更新表中数据
  mysql>update MYTABLE set sex="f" where name='hyq';
 
 
以下是无意中在网络看到的使用MySql的管理心得:
  
在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start"命令,注意启动者应具有管理员权限。
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use mysql;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:
mysql -uroot -p;
mysql -uroot -pnewpassword;
mysql mydb -uroot -p;
mysql mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的数据库的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by "password" ;
grant usage on *.* to NewUserName@HostName identified by "password";
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
posted @ 2011-09-13 15:42 周国选 阅读(25) 评论(0) 编辑


备份数据库出现

mysqldump: Got error: 1016: Can't open file: './ShoppingCart/ShoppingCart_01f8.frm' (errno: 24) when using LOCK TABLES

这样的错误。
 
搜索了一下,发现只要在mysqldump的时候加上--lock-tables=false就可以解决问题。

mysqldump -u root -pMyPassword DbName --lock-tables=false > data.sql

posted @ 2011-09-13 14:55 周国选 阅读(265) 评论(0) 编辑
  2011年9月8日
摘要: 1、查看当前所有对象 SQL> select * from tab; 2、建一个和a表结构一样的空表 SQL> create table b as select * from a where 1=2; SQL> create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2; 3、察看数据库的大小,和空间使用情况 SQL> col tablespace format a20 SQL> select b.file_id 文件ID, b.tablespace_name 表空间, b...阅读全文
posted @ 2011-09-08 10:03 周国选 阅读(25) 评论(0) 编辑
仅列出标题  下一页