免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3147 | 回复: 3
打印 上一主题 下一主题

[求助]Load DB后数据库的device 分配发生变化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-21 21:51 |只看该作者 |倒序浏览
5可用积分
请教各位一个问题,小弟新create一个database,device分配是这样的:
device_fragments               size          usage                created                   free kbytes      
----------------               ----          -----                -------                   -----------      
mx_fullsize2_data_1               30720.0 MB data only            Jan 16 2008  6:14PM               31332044
mx_fullsize2_data_2               30720.0 MB data only            Jan 16 2008  6:14PM               31334400
mx_fullsize2_data_3               16700.0 MB data only            Jan 16 2008  6:14PM               17034000
mx_fullsize2_log_1                15360.0 MB log only             Jan 16 2008  6:14PM       not applicable   

如上,data和log都分开了,但是当我把一个db dump load 进这个DB后,device分配发生了变化:
device_fragments               size          usage                created                   free kbytes      
----------------               ----          -----                -------                   -----------      
mx_fullsize1_data_1                1000.0 MB data only            Jan 17 2008 12:51PM                     56
mx_fullsize1_data_1                 500.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_1                2500.0 MB data only            Jan 17 2008 12:51PM                     84
mx_fullsize1_data_1                 500.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_1               16000.0 MB data only            Jan 17 2008 12:51PM                   1484
mx_fullsize1_data_1                5000.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_1                3500.0 MB data only            Jan 17 2008 12:51PM                      0
mx_fullsize1_data_1                1720.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_2                2280.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_2               15000.0 MB data only            Jan 17 2008 12:51PM                      0
mx_fullsize1_data_2                2500.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_2               10940.0 MB data only            Jan 17 2008 12:51PM                 231532
mx_fullsize1_data_3                7960.0 MB data only            Jan 17 2008 12:51PM                4198144
mx_fullsize1_data_3                3960.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_3                 100.0 MB data only            Jan 17 2008 12:51PM                  56124
mx_fullsize1_data_3                  40.0 MB log only             Jan 17 2008 12:51PM       not applicable   
mx_fullsize1_data_3                4640.0 MB data only            Jan 17 2008 12:51PM                3721944
mx_fullsize1_log_1                15360.0 MB data only            Jan 17 2008 12:51PM               15393356

请问这是什么原因?

最佳答案

查看完整内容

这个问题其实我已经在下面这个帖子7楼第4点已经回复过了:http://bbs.chinaunix.net/thread-1044754-1-1.html很明显,你原来的dump数据库最早1000MB数据500MB日志,后来添加了2500MB数据500MB日志,后来添加了。。。 1000.0 MB data only 500.0 MB log only ----------------1000+500 2500.0 MB data only 500.0 MB log only ----------------2500+50016000.0 MB data only 5000.0 MB log only ...

论坛徽章:
0
2 [报告]
发表于 2008-01-21 21:51 |只看该作者
原帖由 taker2001 于 2008-1-21 21:51 发表
请教各位一个问题,小弟新create一个database,device分配是这样的:
device_fragments               size          usage                created                   free kbytes      
----------------   ...



这个问题其实我已经在下面这个帖子7楼第4点已经回复过了:
http://bbs.chinaunix.net/thread-1044754-1-1.html

很明显,你原来的dump数据库最早1000MB数据500MB日志,后来添加了2500MB数据500MB日志,后来添加了。。。
1000.0 MB data only
  500.0 MB log only
----------------1000+500
2500.0 MB data only
  500.0 MB log only
----------------2500+500
16000.0 MB data only
5000.0 MB log only
----------------16000+5000
3500.0 MB data only
1720.0 MB log only
2280.0 MB log only
----------------3500+4000
15000.0 MB data only
2500.0 MB log only
----------------15000+2500
10940.0 MB data only
7960.0 MB data only
3960.0 MB log only
----------------18900+3960
  100.0 MB data only
   40.0 MB log only
----------------100+40
4640.0 MB data only
15360.0 MB data only
----------------20000+
所以,在创建load数据库的时候,只能按----------------后面的(数据+日志)设备大小依次创建和扩充,不可一步到位。

还有一个方法完全舍弃原来设备顺序,重新整理或使用bcp或使用以下系统存储过程,这里不再祥述:
sp_helpsegment
sp_addsegment
sp_dropsegment
sp_extendsegment

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2008-01-25 13:03 |只看该作者
给你两个过程,自己去原来的库导一下,用生成出来的脚本去新库建库就行了。
第一个:

if (object_id('segcount')<>null) drop procedure segcount
go

select a.name,b.segmap,b.size/512 as size into #dbseg2
        from sysdatabases a,sysusages b
        where a.dbid=b.dbid and 1=2
go
create procedure segcount
@seg int output,
@size int output,
@name varchar(30)
as
begin
--select a.name,b.segmap,b.size/512 as size into #dbseg2
--        from sysdatabases a,sysusages b
--        where a.dbid=b.dbid and 1=2
--go
        set rowcount 1
        select @seg=segmap,@size=size from #dbseg2 where name=@name
        declare @seg2 int
        declare @size2 int
        select @seg2=@seg
        while (exists(select 1 from #dbseg2 where name=@name) and (@seg2=@seg))
        begin
                delete #dbseg2 where name=@name
                select @seg2=segmap,@size2=size from #dbseg2 where name=@name

                if (@@rowcount>0)
                if (@seg2=@seg) select @size=@size+@size2
                else break
        end
        set rowcount 0
end
go

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
4 [报告]
发表于 2008-01-25 13:05 |只看该作者
第二个:
if (object_id('dbseg')<>null) drop procedure dbseg
go
create procedure dbseg
as
begin
--usage: isql -Usa -Pxxxx -Sssss -b > dbseg.log
--     1>exec dbseg
--     2>go
        set nocount on
        declare @name varchar(30)
        declare @dat int
        declare @mix int
        declare @log int
        declare @iii int
       
        select "--Device DDL"
        select a.name,b.segmap,sum(b.size/512) as size into #dbseg
                from sysdatabases a,sysusages b
                where a.dbid=b.dbid and a.dbid>3 and a.dbid<31513
                group by a.name,b.segmap
                order by a.name
        set rowcount 1
        while exists (select name from #dbseg)
        begin
                select @name=name from #dbseg
                select "--"+@name+":"
                if exists(select 1 from #dbseg where name=@name and segmap=3)
                begin
                        select @dat=size from #dbseg where name=@name and segmap=3
                        select "disk init name="+@name+"dat1,physname='/data/dev/"+@name+"dat1.dev',size='"+convert(varchar(20),@dat)+"M'"
                        select "go"
                end
                if exists(select 1 from #dbseg where name=@name and segmap=7)
                begin
                        select @mix=size from #dbseg where name=@name and segmap=7
                        select "disk init name="+@name+"mix1,physname='/data/dev/"+@name+"mix1.dev',size='"+convert(varchar(20),@mix)+"M'"
                        select "go"
                end
                if exists (select 1 from #dbseg where name=@name and segmap=4)
                begin
                        select @log=size from #dbseg where name=@name and segmap=4
                        select "disk init name="+@name+"log1,physname='/data/dev/"+@name+"log1.dev',size='"+convert(varchar(20),@log)+"M'"
                        select "go"
                end
                set rowcount 0
                delete #dbseg where name=@name
                set rowcount 1
        end
       
        select "--Database DDL"
        set rowcount 0
        select a.name,b.segmap,b.size/512 as size into #dbseg2
                from sysdatabases a,sysusages b
                where a.dbid=b.dbid and a.dbid>3 and a.dbid<31513
                order by a.name,b.lstart
        while exists (select name from #dbseg2)
        begin
                set rowcount 1
                select @name=name from #dbseg2
                select "--"+@name+":"
                declare @seg int
                select @seg=segmap from #dbseg2 where name=@name
                if (@seg=3)
                        begin
                                select @dat=0,@log=0
                                exec segcount @seg output,@dat output,@name
                                exec segcount @seg output,@log output,@name
                                select "create database "+@name+" on "+@name+"dat1="+convert(varchar(30),@dat)+" log on "+@name+"log1="+convert(varchar(30),@log)+" for load"
                                select "go"
                        end
                if @seg=7
                begin
                        select @mix=0,@dat=0,@log=0
                        exec segcount @seg output,@mix output,@name
                        exec segcount @seg output,@dat output,@name
                        if (@seg=7)
                        begin
                                select "create database "+@name+" on "+@name+"mix1="+convert(varchar(30),@mix)+" for load"
                                select "go"
                        end
                        else
                        if (@seg=4)
                        begin
                                select @log=@dat
                                select @dat=0
                                select "create database "+@name+" on "+@name+"mix1="+convert(varchar(30),@mix)+" for load"
                                select "go"
                                select "alter database "+@name+" log on "+@name+"log1="+convert(varchar(30),@log)+" for load"
                                select "go"
                        end
                        else
                        if (@seg=3)
                        begin
                                exec segcount @seg output,@log output,@name
                                select "create database "+@name+" on "+@name+"mix1="+convert(varchar(30),@mix)+" for load"
                                select "go"
                                select "alter database "+@name+" on "+@name+"dat1="+convert(varchar(30),@dat)+" log on "+@name+"log1="+convert(varchar(30),@log)+" for load"
                                select "go"
                        end
                end
                while exists (select 1 from #dbseg2 where name=@name)
                begin
                        set rowcount 1
                        exec segcount @seg output,@dat output,@name
                        if (@seg=7) select "alter database "+@name+" on dat"+@name+"mix1="+convert(varchar(30),@dat)+" for load"
                        else if (@seg=3) select "alter database "+@name+" on "+@name+"dat1="+convert(varchar(30),@dat)+" for load"
                        else if (@seg=4) select "alter database "+@name+" log on "+@name+"log1="+convert(varchar(30),@dat)+" for load"
                        select "go"
                end
        end
end
go
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP