docker安装oracle

拉取镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

下载完成后 查看镜像:
docker images

创建容器:
docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

默认启动容器方式(2)
docker run -d -it -p 1521:1521 --name oracle11g --restart=always registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

持久化启动方式如下(3):

1
2
3
4
5
6
7
docker run -d -it -p 1521:1521 --name oracle --restart=always --mount source=oracle_vol,target=/home/oracle/app/oracle/oradata registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

一般用默认启动方式就可以了,若是需要将数据保存到本地的采用持久化方式。

--mount表示要将Host上的路径挂载到容器中。

source=oracle_vol为Host的持久化卷,若未提前创建会自动创建,可通过docker volume instpect 【容器名】查看volume的具体位置,target为容器中的路径
1
2
3
4
5
6
7
8
9
10
docker错误
docker: Error response from daemon: Conflict. The container name "/oracle11g" is already in use by container "7edb8b99791ff4b298a6fa78a7c57be7cd646ab776883b5e07f670ed3506d7bf". You have to remove (or rename) that container to be able to reuse that name

docker stop oracle11g

这里说一下,命令后面的地址一定要是你下载的镜像地址也就是你拉取镜像名字,否则会出现名字已存在等问题!
如果空间不足可以清理数据:
删除所有dangling数据卷(即无用的Volume):

docker volume rm $(docker volume ls -qf dangling=true)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
启动容器

docker start oracle11g

进入镜像进行配置

进入oracle的命令环境中。

docker exec -it oracle11g bash

切换到oracle数据库的root 用户下
su root
密码:helowin

编辑profile文件配置ORACLE环境变量

vi /etc/profile
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=lihao
export PATH=$ORACLE_HOME/bin:$PATH
使配置生效
source /etc/profile
创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
切换到oracle 用户
这里还要说一下,一定要写中间的内条 - 必须要,否则软连接无效
su - oracle
sqlplus /nolog
conn /as sysdba
修改sys、system用户密码:
alter user system identified by li1718;
alter user sys identified by li1718;
alter profile default limit PASSWORD_LIFE_TIME UNLIMITED;
创建用户(可选,根据需要)
用一个具有dba权限的用户登录(sysdba),然后输入以下语句
create user 用户名 identified by 密码;
create user lihao identified by li1718;
grant connect,resource,dba to test;
过程中出现的报错需要输入以下内容:
输入:alter database mount;
输入 :alter database open;

cd $ORACLE_HOME

find /home/oracle/app/oracle/product/11.2.0 -name listener.ora
cd /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin
vi listener.ora

设置服务器主机名
  (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-0PNL4C3)(PORT = 1521))

cd /home/oracle/app/oracle/product/11.2.0/dbhome_2/bin
lsnrctl stop
lsnrctl start

查看oracle版本
https://hub.docker.com/_/oraclelinux
下载docker pull doctorkirk/oracle-19c
docker run -d –name -p :1521 -e ORACLE_SID= -e ORACLE_PDB= -e ORACLE_PWD= :

docker run -d -it -p 1521:1521 –restart=always –name oracle19C –mount source=oracle_vol,target=/home/oracle/app/oracle/oradata doctorkirk/oracle-19c:latest

查看oracle-12c启动日志

docker logs -f oracle19C

docker exec -it oracle19C /bin/bash

在容器中打开 SQLPlus:在容器的命令行界面上,使用以下命令打开 SQLPlus:

sqlplus sys/li1718@lihao as sysdba

docker启动镜像doctorkirk/oracle-19c后连接数据库实例未启动
可能是未找到启动init.ora文件,STARTUP失败

1
2
3
4
sqlplus / as sysdba
SQL> STARTUP
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/19c/dbhome_1/dbs/initlihao.ora'

找到init.ora文件复制到该文件

1
2
find / -name *.ora
cp /opt/oracle/admin/LIHAO/pfile/init.ora /opt/oracle/product/19c/dbhome_1/dbs/initlihao.ora

linux学习-文件权限

用户分类

以文件使用权限划分用户分类:

管理员(root),文件使用者(user),群组成员(group),其他(other)
群组存放于’/etc/group’文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. 新建群组 community
groupadd 群组名
groupadd community
2. 修改群组名
groupmod -n 修改的群组名 原来的群组名
groupmod -n community group01
3. 将用户tmp01加入群组
gpasswd -a 用户名 群组名
gpasswd -a tmp01 group01
4. 用户从组群中删除
gpasswd -d 用户名 群组名
gpasswd -d tmp01 group01
5. 查看用户所属群组
groups #查看当前用户所属群组
group 用户名 #查看用户所属群组

用户存放于’/etc/passwd’文件

1
2
1. 新增用户
2.

文件属性栏

文件属性一栏共有十个字符
-rwxrwx---
第一个字符代表这个文件是“目录、文件或链接文件等等”:

  1. 当为[ d ]则是目录,例如上表文件名为“.config”的那一行;

  2. 当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;

  3. 若是[ l ]则表示为链接文件(link file);

  4. 若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);

  5. 若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。

    余下的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读

(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个
权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

  1. 第一组为“文件拥有者可具备的权限”;
  2. 第二组为“加入此群组之帐号的权限”;
  3. 第三组为“非本人且没有加入本群组之其他帐号的权限”。

改变文件属性与权限

chgrp :改变文件所属群组
chgrp 群组 文件或目录
chown :改变文件拥有者
chown [-R] 用户 文件或目录
chmod :改变文件的权限
权限的设置方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限
各权限的分数对照表如下:

>r:4 > w:2 > x:1

oracle存储过程记录

oracle存储过程,记一下
建立游标查询A表,循环查询的数据处理后保存b表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE PROCEDURE CREATE_VIEW(acton in varchar2,acton2 in varchar2,acton3 in varchar2)
as
--建立游标
CURSOR cur_netnode(Aacton in varchar2,Aacton3 in varchar2)
IS
SELECT * FROM tmp_fetch_data where no1 =Aacton and no2 in (select regexp_substr(Aacton3, '[^,]+', 1, level) as split_result from dual connect by level <= length(Aacton3) -length(replace(Aacton3, ',')) + 1;)WHERE code IS NOT NULL; --游标sql
v_user cur_netnode%rowtype; --定义的行变量,用于接收游标中的数据
BEGIN
OPEN cur_netnode(acton,acton3);--打开游标
loop --循环开始
fetch cur_netnode into v_user; --从游标中提取数据
exit when cur_netnode%notfound;--判断是游标中是否存在数据,不存在退出循环
---id=时间戳+查询id部分
insert into tmp_data2('id','name','age')
values((sysdate -to_date('1970-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss')) * 86400000 + substr(v_user.id,10),v_user.name,v_user.age);
END loop; ---结束循环
close cur_netnode; --关闭游标
END;


crontab定时任务

新建脚本文件
vim test.sh
添加执行权限
chmod +x test.sh
新建文件crontest.cron文件

测试脚本每一分钟执行一次
*/1 * * * * /java/./test.sh >> /java/test.log 2>&1
每晚11:30执行
30 23 * * * /usr/local/crontab/./sql.sh >> /usr/local/crontab/test.log 2>&1
执行

crontab crontest.cron
crontab -l # 表示列出所有的定时任务
crontab -r # 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin”
crontab -e #查看编辑脚本

#每天早上6点10分
10 6 * * * date
#没两个小时 0
*/2 * * * date
#晚上11点到早上8点之间每2个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份一号早上4点
0 4 1 jan * date

tomcat启动检测

为防止tomcat启动但项目未能正确运行调用startup.sh 后定时检测index页面是否可以访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash  

tomcatPath="/user/apache-tomcat"
binPath="$tomcatPath/bin"
APP_NAME="tomcat"

echo "查询所有tomcat并停止"
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
if [ "${pid}" ]; then
for id in $pid
do
kill -9 $id
done
fi
echo "进程已停止"


echo "[info][$(date)]准备启动tomcat"
$binPath"/startup.sh"
if [ $? -eq 0 ]; then
echo "启动命令执行成功........"
echo "检查tomcat运行状态..."
for (( i=0; i<12; ++i ))
do
if [ $(curl -sIL -w "%{http_code}" -o /dev/null http://localhost:8080/login.html) -eq 200 ];then
echo "tomcat启动成功"
break
else
if [[ i -eq 11 ]];then
echo "tomcat启动失败,请查看tomcat日志"
exit 1
else
echo "tomcat正在启动中..."
sleep 5
fi
fi
done
else
echo "启动命令执行失败......."
fi

jvm垃圾回收

垃圾收集(Garbage Collection,GC)

·哪些内存需要回收?
·什么时候回收?
·如何回收?

引用

强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)

·强引用是最传统的“引用”的定义无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
·软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2版之后提供了SoftReference类来实现软引用。
·弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2版之后提供了WeakReference类来实现弱引用。
·虚引用也称为“幽灵引用”或者“幻影引用”,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2版之后提供了PhantomReference类来实现虚引用。

如何判断需要回收的垃圾

  1. 引用计数算法
  2. 可达性分析算法

垃圾收集算法

标记-清除算法

&emsp;&emsp;算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程
它的主要缺点有两个:
&emsp;&emsp;第一个是执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;
&emsp;&emsp;第二个是内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-复制算法

标记-复制算法常被简称为复制算法。
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

标记-整理算法

docker安装

安装

1.安装命令:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
安装成功后,输入docker -v 查看是否成功
Docker version 20.10.17, build 100c701

在用户权限下docker 命令需要 sudo 否则出现以下问题

1
2
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: 
Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json: dial unix /var/run/docker.sock: connect: permission denied

通过将用户添加到docker用户组可以将sudo去掉,命令如下

1
2
3
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组

##2.常用命令

Docker的启动与停止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
systemctl命令是系统服务管理器指令
启动docker:
systemctl start docker
停止docker:
systemctl stop docker
sudo systemctl stop docker.socket
重启docker:
systemctl restart docker
查看docker状态:
systemctl status docker
开机启动:
systemctl enable docker
查看docker概要信息
docker info
查看docker帮助文档
docker ‐‐help
进入容器
docker exec -it [name] bash

常用镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 查看本机所有镜像:
docker images

查看已经启动的容器
docker ps

查找某个镜像
docker search xxx

进入dacker容器
docker attach id
–filter filter 筛选指令
如docker search mysql --filter stars=30筛选出点赞数大于30的mysql镜像
–limit int 搜索结果最大展示数(默认为25)
–no-trunc 列出详细信息

进入dacker容器2
docker exec -it db2 bash

下载/拉取镜像
docker pull xxx:TAG
若不加TAG则表示为latest版本

删除镜像
docker rmi xxx
docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个
docker rmi -f $(docker images -qa) 删除所有


容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
停止容器
docker stop CONTAINER_ID

重命名容器
docker rename 容器ID 新容器名

docker run 启动容器
--restart=always 当docker重启时,容器也重启
-–name=“容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-e 设置环境变量(此处设置了mysql的密码)
-P: 随机端口映射;
-p: 指定端口映射;

如:
docker run --restart=always -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1718 mysql:5.6

如果创建时未指定docker镜像自启动 --restart=always ,可通过update 命令设置
docker update --restart=always xxx