Oracle扩展undo和temp空间

开发用的服务器,安装时从网上拖了个11g的docker直接装了。参数都是用了默认的。
平时都是小数据量的测试,倒也没什么问题,近期要做亿级别的测试时,报undo和temp空间不足。
在扩展了磁盘空间后,开始着手扩充上述配置。版本Oracle11g r2,sys权限.

1、扩展undo空间

有两种方法,一是直接调整undo空间大小,另一种是重建undo空间文件。
本次使用了第一种方法。

SELECT bytes/1024/1024/1024 "Size(GB)",name FROM v$datafile WHERE name LIKE '%UNDO%';


目前是8G,扩展到20G,注意修改undo日志文件路径为上述路径

ALTER DATABASE datafile '/home/oracle/app/oracle/oradata/helowin/UNDOTBS1.dbf' resize 20480M;

2、扩展temp空间

先查询temp空间的信息

SELECT tablespace_name
,file_name
,bytes / 1024 / 1024 size_mb
,used_space / 1024 / 1024 used_mb
,free_space / 1024 / 1024 free_mb
,round((used_space / bytes) * 100
,2) "% USED"
,round((free_space / bytes) * 100
,2) "% FREE"
FROM (SELECT t1.tablespace_name
,t1.file_name
,t1.bytes
,nvl(t2.used_space
,0) used_space
,t1.bytes - nvl(t2.used_space
,0) free_space
FROM (SELECT tablespace_name
,file_name
,SUM(bytes) bytes
,file_id
FROM dba_temp_files
GROUP BY tablespace_name
,file_name
,file_id) t1
,(SELECT tablespace_name
,file_id
,SUM(bytes) used_space
FROM v$temp_extent_map
GROUP BY tablespace_name
,file_id) t2
WHERE t1.tablespace_name = t2.tablespace_name(+)
AND t1.file_id = t2.file_id(+))
ORDER BY tablespace_name
,file_name;

目前分配5G,已经占满了。扩展到20G。
扩展temp也可以使用resize方法和新建temp文件方法。这里使用方法2.

方法1(未验证):

ALTER DATABASE tempfile '/home/oracle/app/oracle/oradata/helowin/temp01.dbf' resize 20480M;

方法2(本文方法):

1)创建新的temp文件 temp02.dbf ,命名表空间名称为 new_temp_ts
2)把默认temp表空间指向新的new_temp_ts
3)删除之前的TEMP

CREATE TEMPORARY TABLESPACE new_temp_ts TEMPFILE '/home/oracle/app/oracle/oradata/helowin/temp02.dbf' SIZE 20480M;

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE new_temp_ts;

DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped

感谢
Oracle改变当前UNDO表空间、TEMP临时表空间大小
Oracle调整临时表空间大小

 

一分钟Linux磁盘无损扩容

之前因为磁盘空间不足导致Oracle挂断后,当时扩充硬盘失败,临时下将Docker整个搬移到了一块大点的盘上做了恢复。
将docker迁移到本机其他磁盘
不料这块100G的盘也有点撑不住了,所以还是要扩容。
原盘100G,先买了20G做了个实验,操作成功后来又买了80G。

期间经过各种折腾后,回头来一想,也就是几句命令的事情,只是第一次做,又担心损坏数据,有点紧张了。
当然下述操作还是基于一个简单的和常见的小型应用场景:
服务器只有一块系统盘,一块数据盘。这次是对数据盘进行扩容。
启用了LVM的不可使用此方法。

下列操作是在120G后面加80G的基础上进行的。
一共执行6个步骤,3个查看+2个操作+1个检查,快的话一分钟就完事了。

Step1.使用 lsblk 查看磁盘情况,200G已经分配到位,但是还没有扩展。

Step2.使用 df -h 查看磁盘可用情况,还是120G,新加的80G需要挂

Step3.使用 fdisk -l 查看磁盘格式

确认类型是Linux,即ext。则可以使用后续方法操作

Step4.执行 growpart /dev/vdb 1 扩展分区
注意扩展的是vdb的第一个分区,中间有个空格。

Step5.执行 resize2fs 命令扩展文件系统

  • 对于ext2、ext3或ext4 文件系统,使用resize2fs命令进行扩展文件系统(本文)。
  • 对于xfs文件系统,使用xfs_growfs进行扩展文件系统(未实际操作)。

Step6. df -h 再次检查磁盘情况

操作完成。

本文主要参考自:华为云扩容云硬盘(无LVM)

 

词典相似度比较

需求:

有两列A和B,每一列的行都是不重复的一个单词或短语,要求以A为主体,在B找出与A相似度>X%的B短语,并输出到文本进行后续处理。
其中A和B在不同的表里,数据也有重合。需要一定的处理才能得到A和B。
其中A约1600行,B约800行。

用mysql写了个相似度的函数,当然可能是因为原表比较复杂的原因,跑了近1个小时了也没出来。

然后参考网上的代码用python写了个原型,执行起来大概1~2分钟的样子。
A和B分别放进不同的文件,最终生成C。

from difflib import SequenceMatcher

def calculate_similarity(s1, s2):
    return SequenceMatcher(None, s1, s2).ratio()

def main():
    with open('a.txt', 'r',encoding='utf-8') as file_a, open('b.txt', 'r',encoding='utf-8') as file_b, open('c.txt', 'w') as output_file:
        phrases_a = file_a.read().splitlines()
        phrases_b = file_b.read().splitlines()
       
        for phrase_a in phrases_a:
            for phrase_b in phrases_b:
                similarity = calculate_similarity(phrase_a, phrase_b)
                if similarity > 0.7:
                    output_file.write(f"{phrase_a}||{phrase_b}\n")

if __name__ == "__main__":
    main()

将docker迁移到本机其他磁盘

背景:

华为云上用docker部署了oracle,某天oracle突然无法访问了,发现是磁盘满了,导致oracle无法启动。
磁盘情况:vda系统盘40G,vdb数据盘100G。开始安装时使用了默认参数安装在了系统盘,目前是40G的系统盘满了。

方案1:扩充系统盘。
增加了20G,也扩展到了60G,但是系统仍显示vda占用100%。仍然无法启动。所以尝试使用方案2.

方案2:将docker迁移到100G的数据盘上

1.停止所有正在运行的Docker容器

docker stop $(docker ps -aq)

2.停止Docker服务

systemctl stop docker

3.复制Docker目录到新的位置
使用cp或rsync等工具将Docker目录复制到新的位置。我的目标路径是数据盘 /mydata

sudo rsync -aqxP /var/lib/docker/ /mydata/docker

4.更新Docker配置文件/etc/docker/daemon.json
如果文件不存在,需要创建(touch /etc/docker/daemon.json)。
示例配置文件如下所示:(registry-mirrors、dns两个值填你自己的镜像仓库和DNS服务器地址)

{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
"dns": ["IP1", "IP2"],
"data-root": "/mydata/docker"
}

如果不知道前面的怎么填,一般直接最简单的即可

{
"data-root": "/mydata/docker"
}

5.重新装载daemon配置

systemctl daemon-reload

6.启动Docker服务

systemctl start docker

7.查看image

docker ps -a

8.启动容器:运行docker start 命令启动之前停止的所有容器。

docker start <container_id>

9.进入容器进行测试

docker start oracle11g
docker exec -it oracle11g /bin/bash
/home/oracle/app/oracle/product/11.2.0/dbhome_2


export ORACLE_HOME="/home/oracle/app/oracle/product/11.2.0/dbhome_1";
export PATH=$ORACLE_HOME/bin:$PATH;
export ORACLE_SID=orcle;

sqlplus /nolog
conn /as sysdba

补充一个操作上的问题:
在操作玩第6步查看image的时候,发现列表是空的。

用docker info 看了各项参数信息,发现data root仍是之前的。

那就是daemon.json没有生效。原因是我在操作的时候,没有理解这个位置是固定的/etc/docker/daemon.json,而是建在了迁移后的路径里 /mydata/docker/daemon.json
所以没有生效。
新建了/etc/docker/daemon.json后,

后续操作正常。