0%

一、资金时间价值的计算

符号和缩略语:

P:本金;

F:最终本金与利息和;

i:利率;

id:记息期单利利率;

A:年金/月金等,发生在(或折算为)某一特定时间序列各计息期(不包括零期)的等额资金序列的价值;

G:等差系列现金流量中相邻现金流量相差同一个常数G;

j:等比系列现金流量中前后现金流量按同一个比例j连续递增

1、单利

总结:F = P( 1 + n * id)

1png

2、复利

(1)一次性支付

总结:现值计算(已知F求P):P = F( P/F, i, n)

2png

(2)多次支付

9png

  • 等额

1)终值计算(已知A求F):F = A(F/A, i, n)

2)现值计算(已知A求P):P = A(P/A, i, n)

3)资金回收计算(已知P求A):A = P(A/P, i, n)

4)偿债基金计算(已知F求A):A = F(A/F, i, n)

3png

  • 等差

1)终值计算(已知G求F):F = G(F/G, i, n)

2)现值计算(已知G求P):P = G(P/G, i, n)

3)等差年金计算(已知G求A):A = G(A/G, i, n)

4png

  • 等比

1)现值计算:P = A(P/A, i, j, n)

2)终值计算:F = A(F/A, i, j, n)

5png

3、名义利率与实际利率

6png

4、等值计算与应用

7png

附录:Ⅰ 复利因子

我们知道,通过使用Mybatis Generator,我们可以快速生成数据库已有表的增删改查方法,极大的提高开发效率。

然而我们可能会遇到一个问题,我们继承AbstractXmlElementGenerator方法所实现的自定义mapper方法,每次运行都会重复添加,固然我们可以手动删除,但工具不就是让人们得以偷懒吗,而且作为一个强迫症患者兼程序员,这是不可容忍的。

遇事第一步当然是使用搜索引擎了,也查到通过继承类 PluginAdapter ,重写 sqlMapGenerated 方法,改 GeneratedXmlFile 中成员变量 isMergeable 的值为 false 的解决方法。但经过尝试后发现,使用此种方式,自己新定义的方法就全没了,这可不行,还不如不改呢。

没办法,看来得研究新的解决办法。通过 IDEA 的快捷键 Ctrl + B, 可以发现在类 org.mybatis.generator.api.MyBatisGenerator 的 writeGeneratedXmlFile 方法中调用了 GeneratedXmlFile 的 isMergeable 方法,代码如下:

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
private void writeGeneratedXmlFile(GeneratedXmlFile gxf, ProgressCallback callback)
throws InterruptedException, IOException {
File targetFile;
String source;
try {
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
targetFile = new File(directory, gxf.getFileName());
if (targetFile.exists()) {
if (gxf.isMergeable()) {
source = XmlFileMergerJaxp.getMergedSource(gxf,
targetFile);
} else if (shellCallback.isOverwriteEnabled()) {
source = gxf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf
.getFileName());
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gxf.getFormattedContent();
}

callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, "UTF-8"); //$NON-NLS-1$
} catch (ShellException e) {
warnings.add(e.getMessage());
}
}

其中对 gxf(GeneratedXmlFile) 进行是否合并判断, 如果返回值为 true,那么将调用 XmlFileMergerJaxp.getMergedSource(gxf,targetFile) 方法,而默认值即为 true。

固需要了解 getMergedSource 方法做了什么,查看代码发现这里调用了重载方法,而在重载方法中我们可以找到如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// remove the old generated elements and any
// white space before the old nodes
List<Node> nodesToDelete = new ArrayList<Node>();
NodeList children = existingRootElement.getChildNodes();
int length = children.getLength();
for (int i = 0; i < length; i++) {
Node node = children.item(i);
if (isGeneratedNode(node)) {
nodesToDelete.add(node);
} else if (isWhiteSpace(node)
&& isGeneratedNode(children.item(i + 1))) {
nodesToDelete.add(node);
}
}

通过注解知道,Mybatis Generator 会删除它自身生成的 mapper 方法,这也是为什么只有我们自定义的 mapper 方法才会有重复的情况。

再看看代码,发现这里通过 isGeneratedNode 方法判断是否需要删除 mapper 方法,代码如下:

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
42
43
44
private static boolean isGeneratedNode(Node node) {
boolean rc = false;

if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String id = element.getAttribute("id"); //$NON-NLS-1$
if (id != null) {
for (String prefix : MergeConstants.OLD_XML_ELEMENT_PREFIXES) {
if (id.startsWith(prefix)) {
rc = true;
break;
}
}
}

if (rc == false) {
// check for new node format - if the first non-whitespace node
// is an XML comment, and the comment includes
// one of the old element tags,
// then it is a generated node
NodeList children = node.getChildNodes();
int length = children.getLength();
for (int i = 0; i < length; i++) {
Node childNode = children.item(i);
if (isWhiteSpace(childNode)) {
continue;
} else if (childNode.getNodeType() == Node.COMMENT_NODE) {
Comment comment = (Comment) childNode;
String commentData = comment.getData();
for (String tag : MergeConstants.OLD_ELEMENT_TAGS) {
if (commentData.contains(tag)) {
rc = true;
break;
}
}
} else {
break;
}
}
}
}

return rc;
}

在 rc==false 的情况下,有如下关键代码:

1
2
3
4
5
6
for (String tag : MergeConstants.OLD_ELEMENT_TAGS) {
if (commentData.contains(tag)) {
rc = true;
break;
}
}

联系前文可以知道,只要 mapper 中包含 MergeConstants.OLD_ELEMENT_TAGS 的内容,合并时就会被删除,这不正是我们需要的吗,再看看 MergeConstants.OLD_ELEMENT_TAGS 又是什么

1
2
3
4
5
6
public static final String NEW_ELEMENT_TAG = "@mbg.generated"; //$NON-NLS-1$
public static final String[] OLD_ELEMENT_TAGS = {
"@ibatorgenerated", //$NON-NLS-1$
"@abatorgenerated", //$NON-NLS-1$
"@mbggenerated", //$NON-NLS-1$
"@mbg.generated" }; //$NON-NLS-1$

这只是一些字符串,这还不容易吗,让我们试验一下,我在自定义的 AbstractXmlElementGenerator 实现类添加了以下代码

1
2
newXmlElement.addElement(new TextElement("<!-- ELEMENT FOR GENERATOR MERGE - " 
+ MergeConstants.NEW_ELEMENT_TAG + " -->"));

其中 newXmlElement 为 XmlElement 的实例,因为 NEW_ELEMENT_TAG 也包含在 OLD_ELEMENT_TAGS中,所以这里直接使用 NEW_ELEMENT_TAG ,最后通过 parentElement.addElement(newXmlElement) 添加到父元素中。

运行发现,果然成功了,旧的被删除了,新的进来,后写的 mapper 方法还在,至此大功告成。

再次发现,遇到问题查源码是多么重要。

By the way,这里用的 mybatis-generator-core 的版本是 1.3.5。

1. 增加docker yum源

1
2
3
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

2. 安装docker

yum list docker-ce --showduplicates | sort -r #查看所有有效的 docker-ce 的版本
得到类似如下列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker-ce.x86_64         2:18.09.0.ce-0.4.tp4.el7               docker-ce-test  
docker-ce.x86_64 2:18.09.0.ce-0.3.tp3.el7 docker-ce-test
docker-ce.x86_64 2:18.09.0.ce-0.0.tp0.el7 docker-ce-test
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-test
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-edge
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-test
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-edge
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-test
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-edge
docker-ce.x86_64 18.06.1.ce-3.el7 @docker-ce-edge
docker-ce.x86_64 18.06.1.ce-2.2.rc2.el7 docker-ce-test
docker-ce.x86_64 18.06.1.ce-2.1.rc1.el7 docker-ce-test
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-test
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-edge
docker-ce.x86_64 18.06.0.ce-2.3.rc3.el7 docker-ce-test
docker-ce.x86_64 18.06.0.ce-2.2.rc2.el7 docker-ce-test
docker-ce.x86_64 18.06.0.ce-2.1.rc1.el7 docker-ce-test
docker-ce.x86_64 18.05.0.ce-3.el7.centos docker-ce-test
docker-ce.x86_64 18.05.0.ce-3.el7.centos docker-ce-edge
docker-ce.x86_64 18.05.0.ce-2.1.rc1.el7.centos docker-ce-test

yum install docker-ce-18.06.1.ce #安装最新稳定版本

3. 自定义docker配置

默认docker将目录配置到/var/lib/docker目录下,镜像也是访问国外的仓库,我们可以进行配置。
这里我把docker目录配置为/usr/docker,镜像服务使用阿里的:https://cr.console.aliyun.com

1
2
mkdir /etc/docker
vi /etc/docker/daemon.json

写入以下内容

1
2
3
4
{ 
"graph":"/usr/docker",
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

4. 启动docker**

systemctl start docker

查看docker信息,可以看到Docker Root Dir 和 RegistryMirrors 都变成了 /etc/docker/daemon.json 中配置的内容了

docker info

常用docker命令:
docker ps #正在运行的容器
docker ps -a #所有的容器
docker start [NAME]/[CONTAINER ID] #启动容器
docker stop [NAME]/[CONTAINER ID] #停止容器
docker rm [NAME]/[CONTAINER ID] #删除容器
docker update --restart=always [NAME]/[CONTAINER ID] #容器自启
docker exec -it [CONTAINER ID] /bin/bash # 已运行容器进入交互模式

5. 安装gitlab

下载镜像

获取gitlab版本:访问https://hub.docker.com,搜索 Gitlab-ce。 ps: Gitlab Community Edition汉化版,无docker镜像
docker pull gitlab/gitlab-ce:11.10.1-ce.0 #下载镜像,镜像有1g多,需要等待一段时间

数据持久化保存

因为容器的数据是不能持久化保存的。所以我们需要用 docker volume 的方式将存储的数据映射到操作系统的目录中来。这样就算运行的容器崩溃,我们重新启动一个新的容器,原来容器中的数据还是不会丢失
这里使用目录 /usr/gitlab 来保存 gitlab 容器中的数据

运行 gitlab

1
2
3
4
5
6
7
8
docker run --name gitlab -d \
--publish 10080:10080 --publish 10022:22 \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://服务器ip:10080/'; gitlab_rails['gitlab_shell_ssh_port'] = 10022;" \
--restart unless-stopped \
--volume /usr/gitlab/config:/etc/gitlab \
--volume /usr/gitlab/logs:/var/log/gitlab \
--volume /usr/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:11.10.1-ce.0

这里把主机的10080、10022映射到容器,这样我们可以用10080端口访问web页面,用10022进行clone操作。这里要关闭selinux,开放防火墙的10080、10022端口。
同时使用 –volume /usr/gitlab/config:/etc/gitlab 、 –volume /usr/gitlab/logs:/var/log/gitlab 、 –volume /usr/gitlab/data:/var/opt/gitlab 这三个参数将 gitlab 的配置、数据和日志持久化到实体主机文件系统上来。

修改run参数:停止所有容器,停止docker,进入docker目录/containers/容器id,修改config.v2.json、hostconfig.json
去除不需要的80、443端口监听:修改config.v2.json中的 ExposedPorts ,删除 “443/tcp”:{},”80/tcp”:{}
修改 gtilab.rb 配置文件,下边是我自己的配置:

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
external_url 'http://服务器ip/域名:10080'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'xxx@aliyun.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
gitlab_rails['gitlab_email_reply_to'] = 'xxx@aliyun.com'
gitlab_rails['gitlab_shell_ssh_port'] = 10022
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.aliyun.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xxx@aliyun.com"
gitlab_rails['smtp_password'] = "********"
gitlab_rails['smtp_domain'] = "smtp.aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
user['git_user_name'] = "GitLab"
user['git_user_email'] = "xxx@aliyun.com"
unicorn['worker_timeout'] = 60
unicorn['worker_processes'] = 2
unicorn['worker_memory_limit_min'] = "100 * 1 << 20"
unicorn['worker_memory_limit_max'] = "200 * 1 << 20"
sidekiq['concurrency'] = 10
postgresql['shared_buffers'] = "128MB"
postgresql['max_worker_processes'] = 4
nginx['listen_port'] = 10080

6. 访问 gitlab web 页面

打开浏览器访问 http://服务器id:10080 进入 gitlab 界面,这一步可能需要等待一段时间,等待 gitlab 启动完成,期间可能会出现502页面,一般没事,多等一会儿就好了
首次访问会让我们设置root账户密码,至于其他操作这里就不介绍了。

这里说一下,如果Clone with SSH的链接的类似 git@28085bf9f5c8:xxx/xxxx.git 的地址,需要改成 git@服务器ip:10022/xxx/xxxx.git
还有,Clone前要先配置 SSH Keys,这里推荐一种方法,使用git bash运行 ssh-keygen,生成id_rsa私钥和id_ras.pub公钥,把id_rsa.pub的内容复制到gitlab上,
再打开TortoiseGit的PuTTYgen,点击 Load,加载id_rsa之后,点击Save private Key保存成ppk,之后就可以使用TortoiseGit加载保存的ppk文件进行后续操作了
像克隆操作,使用的url例如 ssh://git@服务器ip:10022/xxx/xxxx.git

1. 安装图形界面

yum groupinstall "X Window System"
yum groupinstall "GNOME Desktop"
xhost + #禁用访问控制,客户端可以用任何主机连接
查看已经安装以及可以安装的软件:yum grouplist
开启图形界面:init 5 或 startx
关闭图形界面:init 3
设置默认使用图形界面:systemctl set-default graphical.target
设置默认使用命令行界面:systemctl set-default multi-user.target

2. 安装xterm用于Xmanager远程连接图形界面

yum install xterm

3. 配置主机名(这里及以后的zzwork都是表示主机名)

1
2
3
4
5
6
7
8
9
vi /etc/sysconfig/network
# Created by anaconda
hostname=zzwork`

vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 zzwork
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

/etc/init.d/network restart #立即生效

4. 防火墙开放1521端口,这里根据实际情况操作

firewall-cmd --zone=public --permanent --add-port=1521/tcp
firewall-cmd --reload

5. 关闭selinux

sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
setenforce 0
查看selinux状态:getenforce 或 sestatus -v 显示Permissive或Disabled即为已关闭

6. 修改内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi /etc/sysctl.conf
# for oracle
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
fs.file-max = 6815744 #设置最大打开文件数
fs.aio-max-nr = 1048576
kernel.shmall = 2097152 #共享内存的总量,8G内存设置:2097152*4k/1024/1024
kernel.shmmax = 2147483648 #最大共享内存的段大小
kernel.shmmni = 4096 #整个系统共享内存端的最大数
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500 #可使用的IPv4端口范围
net.core.rmem_default = 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576

sysctl -p #立即生效

7. 修改oracle用户限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vi etc/security/limits.conf #加入以下内容
#for oracle
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

vi /etc/pam.d/login #使limits.conf配置立即生效
session required pam_limits.so

vi /etc/profile #加入以下内容
#for oracle
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

source /etc/profile #使配置立即生效

8. 创建用户以及用户组

1
2
3
4
5
6
7
8
9
10
11
[root@centos ~]# groupadd oinstall    #创建用户组oinstall
[root@centos ~]# groupadd dba #创建用户组dba
[root@centos ~]# useradd -g oinstall -G dba -m oracle #创建oracle用户,并加入到oinstall和dba用户组
[root@centos ~]# passwd oracle #设置用户oracle的登陆密码,不设置密码,在CentOS的图形登陆界面没法登陆
更改用户 oracle 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@centos ~]# id oracle # 查看新建的oracle用户
uid=1000(oracle) gid=1000(oinstall) groups=1000(oinstall),1001(dba)
[root@centos ~]#

9. 创建数据库目录和数据文件存放目录,根据实际情况修改

1
2
3
4
5
mkdir -p /usr/oracle/product    #创建oracle安装目录
mkdir -p /usr/oracle/oradata #创建oracle数据文件存放目录
mkdir -p /usr/oracle/oraInventory #创建oracle数据库清单目录
chown -R oracle:oinstall /usr/oracle #设置oracle用户为目录的所有者
chmod -R 775 /usr/oracle/ #修改权限

10. 配置oracle用户环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
su oracle #切换为oracle用户
vi /home/oracle/.bash_profile #修改为以下内容
# for oracle
export ORACLE_BASE=/usr/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
export ORACLE_SID=orcl
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
#修改编码
export NLS_LANG=AMERICAN_AMERICA.UTF8
export LANG=en_US.UTF8

PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin

export PATH

source /home/oracle/.bash_profile #使配置立即生效

11. 安装必须软件包

yum install binutils* compat-libcap1* compat-libstdc++* gcc* gcc-c++* glibc* glibc-devel* ksh* libaio* libaio-devel* libgcc* libstdc++* libstdc++-devel* libXi* libXtst* make* sysstat* elfutils* unixODBC* unzip lrzsz

12. 解压从oracle官网下载的zip压缩包

1
2
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip

13. 使用Xstart工具并通过oracle用户登录(也可用类似软件),命令选择xterm(Linux)

xdpyinfo #查看name of display的值,例如localhost:1.0
export DISPLAY=localhost:1.0 #上一步的值

14. 修改解压目录下的db_install.rsp并安装,这里为/usr/database,这里使用静默安装,因为安装界面会卡死

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vi db_install.rsp
oracle.install.option=INSTALL_DB_SWONLY        # 安装类型
ORACLE_HOSTNAME=zzwork     # 主机名称
UNIX_GROUP_NAME=oinstall # 安装组
INVENTORY_LOCATION=/usr/oracle/oraInventory # INVENTORY目录
SELECTED_LANGUAGES=en,zh_CN # 选择语言
ORACLE_HOME=/usr/oracle/product/11.2.0 # oracle_home
ORACLE_BASE=/usr/oracle # oracle_base
oracle.install.db.InstallEdition=EE # oracle版本
oracle.install.db.DBA_GROUP=dba # dba用户组
oracle.install.db.OPER_GROUP=oinstall # oper用户组
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE # 数据库类型
oracle.install.db.config.starterdb.globalDBName=orcl # globalDBName
oracle.install.db.config.starterdb.SID=orcl # SID
oracle.install.db.config.starterdb.characterSet=AL32UTF8 # 默认数据库编码
oracle.install.db.config.starterdb.memoryLimit=800 # 自动管理内存的最小内存(M)
oracle.install.db.config.starterdb.password.ALL=oracle # 设定所有数据库用户使用同一个密码
DECLINE_SECURITY_UPDATES=true # 设置安全更新

./runInstaller -silent -responseFile /usr/database/db_install.rsp -ignorePrereq

1.如果出现/usr/bin/xdpyinfo或NoClassDefFoundError错误,检查步骤13
2.安装期间可以新建终端通过tail命令查看安装日志 tail -f filePath
3.出现图下提示时,若说安装已完成

1
2
3
4
5
6
7
8
9
10
11
12
The following configuration scripts need to be executed as the "root" user. 
#!/bin/sh
#Root scripts to run

/usr/oracle/product/11.2.0/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as "root"
3. Run the scripts
4. Return to this window and hit "Enter" key to continue

Successfully Setup Software.

15. 使用root用户按上一步骤提示执行脚本

sh /usr/oracle/product/11.2.0/root.sh

16. 配置监听程序

1
2
3
4
5
6
7
8
9
10
vi /usr/database/response/netca.rsp
INSTALL_TYPE=""custom"" # 安装的类型
LISTENER_NUMBER=1 # 监听器数量
LISTENER_NAMES={"LISTENER"} # 监听器的名称列表
LISTENER_PROTOCOLS={"TCP;1521"} # 监听器使用的通讯协议列表
LISTENER_START=""LISTENER"" # 监听器启动的名称

/usr/oracle/product/11.2.0/bin/netca /slient /responseFile /usr/database/response/netca.rsp

netstat -tnulp | grep 1521 #查看监听程序是否执行

开启监听:/usr/oracle/product/11.2.0/bin/lsnrctl start
关闭监听:/usr/oracle/product/11.2/0/bin/lsnrctl stop

17. 添加数据库实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi /usr/database/response/dbca.rsp
RESPONSEFILE_VERSION ="11.2.0" // 不要修改
OPERATION_TYPE ="createDatabase" // 操作为创建实例
GDBNAME ="orcl" // 数据库实例名
SID ="orcl" // 实例名字
TEMPLATENAME = "General_Purpose.dbc" // 建库用的模板文件
SYSPASSWORD = "oracle" // SYS管理员密码
SYSTEMPASSWORD = "oracle" // SYSTEM管理员密码
SYSMANPASSWORD= "oracle"
DBSNMPPASSWORD= "oracle"
DATAFILEDESTINATION =/usr/oracle/oradata // 数据文件存放目录
RECOVERYAREADESTINATION=/usr/oracle/flash_recovery_area // 恢复数据存放目录
CHARACTERSET ="AL32UTF8" // 字符集
TOTALMEMORY ="3276" // 1638MB,物理内存2G*80%。根据实际情况修改

/usr/oracle/product/11.2.0/bin/dbca -slient -responseFile /usr/database/response/dbca.rsp

执行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[oracle@oracledb ~]$ /usr/oracle/product/11.2.0/bin/dbca -slient -responseFile /usr/database/response/dbca.rsp
Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file "/usr/oracle/cfgtoollogs/dbca/orcl/orcl.log" for further details.

查看进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[oracle@oracledb ~]$ ps -ef | grep ora_ | grep -v grep
oracle 19304 1 0 18:33 ? 00:00:00 ora_pmon_orcl
oracle 19306 1 0 18:33 ? 00:00:00 ora_vktm_orcl
oracle 19310 1 0 18:33 ? 00:00:00 ora_gen0_orcl
oracle 19312 1 0 18:33 ? 00:00:00 ora_diag_orcl
oracle 19314 1 0 18:33 ? 00:00:00 ora_dbrm_orcl
oracle 19316 1 0 18:33 ? 00:00:00 ora_psp0_orcl
oracle 19318 1 0 18:33 ? 00:00:00 ora_dia0_orcl
oracle 19320 1 0 18:33 ? 00:00:00 ora_mman_orcl
oracle 19322 1 0 18:33 ? 00:00:00 ora_dbw0_orcl
oracle 19324 1 0 18:33 ? 00:00:00 ora_lgwr_orcl
oracle 19326 1 0 18:33 ? 00:00:00 ora_ckpt_orcl
oracle 19328 1 0 18:33 ? 00:00:00 ora_smon_orcl
oracle 19330 1 0 18:33 ? 00:00:00 ora_reco_orcl
oracle 19332 1 0 18:33 ? 00:00:00 ora_mmon_orcl
oracle 19334 1 0 18:33 ? 00:00:00 ora_mmnl_orcl
oracle 19336 1 0 18:33 ? 00:00:00 ora_d000_orcl
oracle 19338 1 0 18:33 ? 00:00:00 ora_s000_orcl
oracle 19361 1 0 18:34 ? 00:00:00 ora_qmnc_orcl
oracle 19376 1 0 18:34 ? 00:00:00 ora_cjq0_orcl
oracle 19396 1 0 18:34 ? 00:00:00 ora_q000_orcl
oracle 19398 1 0 18:34 ? 00:00:00 ora_q001_orcl

修改启动和关闭实例的程序

1
2
3
修改文件: /usr/oracle/product/11.2.0/bin/dbstart  /usr/oracle/product/11.2.0/bin/dbshut
将ORACLE_HOME_LISTNER=$1 修改为 ORACLE_HOME_LISTNER=/usr/oracle/product/11.2.0
修改 /etc/oratab 为 orcl:/usr/oracle/product/11.2.0:Y

启动或者关闭实例(以oracle用户执行)
启动实例: /usr/oracle/product/11.2.0/bin/dbstart
关闭实例: /usr/oracle/product/11.2.0/bin/dbshut

进入oracle命令行:/usr/oracle/product/11.2.0/bin/sqlplus / as sysdba

18. 设置开机自启

1
2
3
4
5
chmod +x /etc/rc.d/rc.local
vi /etc/rc.d/rc.local #加入以下内容
#for oracle
su oracle -lc "/usr/oracle/product/11.2.0/bin/lsnrctl start"
su oracle -lc "/usr/oracle/product/11.2.0/bin/dbstart"

  1. 编辑apache配置文件,通过yum安装方式的配置文件应是/etc/httpd/conf/httpd.conf
    vi /etc/httpd/conf/httpd.conf

  2. 在55行左右添加对应php版本的so的加载配置(这里php版本是7.x)
    LoadModule php7_module modules/libphp7.so

  3. 在285行左右添加php文件的识别
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

  4. 文件中 AllowOverride None 改为 AllowOverride ALL

  5. 保存文件,重启httpd服务

  1. 打开“网络和共享中心”选择“VMware Virtual Ethernet Adapter for VMnet8”网卡,右键选择属性,配置tcp/ipv4为自动获取

6png

  1. 为了本机能用ssh等方式访问虚拟机,开启VMware Bridge Protocol,并启用共享

10png

11png

  1. 打开VMware–编辑–虚拟网络编辑器

1png

  1. 打开后界面如下

2png

  1. 点击右下角更改设置,比较VMnet8和本机的配置是否对应

    VMnet8的部分子网和子网掩码信息

3png

本机ipconfig命令查看到的实际所用网络信息

4png

  1. 更改centos虚拟机网络设置为NAT模式

9png

  1. 修改centos网络配置信息

    vi /etc/sysconfig/network-scripts/ifcfg-ens33
    
  2. 配置信息,不需要ip、网络之类的配置

5png

  1. 修改完成后重启网络设置,或者重启虚拟机

    service network restart
    
  2. 执行ifconfig查看是否设置网络成功,有了ip号就表示设置成功了

7png

  1. Ping百度试试

8png

  1. 如果后续发现虚拟机无法上网,可以先改成如下设置(192.168.3.128为虚拟机中ifconfig查看到的ip),再改成第1步骤所示的自动获取ip,此过程可能需要重启虚拟机?

12png

  • cd到${java_home}/bin目录
    cd ${JAVA_HOME}/bin

  • 新增jstatd.all.policy文件,文件内容如下

    1
    2
    3
      grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
    };
  • 后台运行jstatd服务
    jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true

  • 查看jstatd服务使用的端口
    netstat -ntlp | grep jstatd

  • 开放查看到的两个端口,除了1099端口,另外一个是随机的

  • 然后就可以用本机java/bin目录下的jvisualvm.exe文件连接
    双击”远程”,在主机名内输入服务器地址,然后点击”确定”

  • 此方法无法查看cpu运行状态,显示”不受此jvm支持”

需要安装的工具

yum install -y wget unzip gcc gcc-c++ perl

安装ffmpeg

yum install -y ffmpeg

创建临时文件夹

  • 切换到home目录
    cd /home

  • 新建文件夹
    mkdir build

  • 进入build文件夹
    cd build

下载并解压pcre

  • 下载pcre
    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz

  • 解压pcre
    tar -zxvf pcre-8.41.tar.gz

下载并解压zlib

  • 下载zlib
    wget http://www.zlib.net/zlib-1.2.11.tar.gz

  • 解压zlib
    tar -zxvf zlib-1.2.11.tar.gz

下载并安装openssl

  • 下载openssl
    wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz

  • 解压openssl
    tar -zxvf openssl-1.1.1a.tar.gz

  • 切换到openssl目录里
    cd openssl-1.1.1a

  • 生成配置文件 默认配置
    ./config --prefix=/usr/local --openssldir=/usr/local/openssl

  • 编译程序
    make

  • 安装程序
    make install

  • 切换回build目录
    cd ..

下载并解压nginx-rtmp-model

  • 下载nginx-rtmp-module
    wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master

  • 解压nginx-rtmp-module
    unzip -o master.zip

下载并安装nginx

  • 下载nginx
    wget http://nginx.org/download/nginx-1.14.0.tar.gz

  • 解压nginx
    tar -zxvf nginx-1.14.0.tar.gz

  • 切换到nginx目录
    cd nginx-1.14.0

  • 生成配置文件
    ./configure --with-http_ssl_module --with-pcre=../pcre-8.41 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.1a --add-module=../nginx-rtmp-module-master

  • 编译程序
    make

  • 安装程序
    make install

修改nginx配置

  • 备份nginx.conf
    cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

  • 修改nginx.conf
    vi /usr/local/nginx/conf/nginx.conf

  • events后添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    rtmp {
    server {

    listen 1935;
    chunk_size 4000;

    application myapp {
    live on;
    record off;
    }

    application hls {
    live on;
    hls on;
    hls_path /tmp/hls;
    }
    }
    }
  • http的service中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #数据格式设置
    charset utf-8;
    #配置hls
    location /hls {
    types {
    application/vnd.apple.mpegurl m3u8;
    video/mp2t ts;
    }
    root /tmp;
    add_header Cache-Control no-cache;
    }

把nginx添加进systemctl

  • 添加并编辑nginx.service文件
    vim /usr/lib/systemd/system/nginx.service

  • 在文件中填入下面文字并保存

    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
    [Unit]

    Description=nginx - high performance web server

    Documentation=http://nginx.org/en/docs/

    After=network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking

    PIDFile=/usr/local/nginx/logs/nginx.pid

    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

    ExecReload=/usr/local/nginx/sbin/nginx -s reload

    ExecStop=/usr/local/nginx/sbin/nginx -s stop

    ExecQuit=/usr/local/nginx/sbin/nginx -s quit

    PrivateTmp=true

    [Install]

    WantedBy=multi-user.target
  • 重载systemctl命令
    systemctl daemon-reload

添加hls视频播放网页

  • 添加并编辑文件
    vi /usr/local/nginx/html/video.html

  • 在文件中填入下面文字并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script src="https://open.ys7.com/sdk/js/1.3/ezuikit.js"></script>
<video id="myPlayer" poster="" controls playsInline webkit-playsinline autoplay>
<source src="http://服务器ip/test.m3u8" type="application/x-mpegURL" />
</video>
<script>
//初始化播放器
var player = new EZUIPlayer('myPlayer');
player.on('error', function(error) {
playSuccess=0;
console.log('error');
});
player.on('play', function() {
playSuccess=1;
console.log('play');
});
player.on('pause', function() {
playSuccess=0;
console.log('pause');
});

</script>
  • 启动nginx服务
    systemctl start nginx

  • 开启ffmpeg转码
    ffmpeg -f rtsp -rtsp_transport tcp -i "rtsp:填入rtsp地址" -strict -2 -c:v libx264 -vsync 2 -c:a aac -f hls -hls_time 5 -hls_list_size 2 -hls_wrap 2 /usr/local/nginx/html/test.m3u8

  • 在浏览器中打开网址,即可查看转码后视频。服务器要开启80端口
    服务器ip/video.html

添加rtmp视频播放网页

  • 添加并编辑文件
    vi /usr/local/nginx/html/rtmp.html

  • 在文件中填入下面文字并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script src="https://open.ys7.com/sdk/js/1.3/ezuikit.js"></script>

<video id="myPlayer" poster="" controls playsInline webkit-playsinline autoplay>
<source src="rtmp://服务器ip:1935/myapp/test" type="" />
</video>

<script>
//初始化播放器
var player = new EZUIPlayer('myPlayer');
player.on('error', function(error) {
playSuccess=0;
console.log('error');
});
player.on('play', function() {
playSuccess=1;
console.log('play');
});
player.on('pause', function() {
playSuccess=0;
console.log('pause');
});

</script>
  • 启动nginx服务
    systemctl start nginx

  • 开启ffmpeg转码
    ffmpeg -f rtsp -rtsp_transport tcp -i "rtsp:填入rtsp地址" -strict -2 -c:v libx264 -vsync 2 -c:a aac -f flv -s 640x360 -q 10 rtmp://localhost:1935/myapp/test

  • 在浏览器中打开网址,即可查看转码后视频。服务器要开启80、1935端口
    服务器ip/rtml.html

mysql

  1. sql自增
    id int(11) not null auto_increment,primary key (id)

  2. mybatis model配置,让数据库生成id
    @GeneratedValue(generator = "JDBC")

  3. 查看下一个自增值

  • 方式1:无法做筛选
    show table status where name='表名'

  • 方式2:
    select auto_increment from information_schema.tables where table_schema='数据库名' and table_name='表名'

postgresql

  • 方式1:建表时自动建序列
  1. 建表
    "id" serial not null

  2. 设为主键
    alter table 表名 add primary key ("id");

  3. 获取id当前自增值
    select currval('表名_id_seq')

  4. 获取id下一个自增值
    select nextval('表名_id_seq')

  • 方式2:先建序列在建表
  1. 建序列
    create sequence 序列名 increment by 1 minvalue 1 no maxvalue start with 1;

  2. 建表
    "id" int4 default nextval('序列名'::regclass) not null

  3. 设为主键
    alter table 表名 add primary key ("id");

  • mybatis model配置,让数据库生成id
    @GeneratedValue(generator = "JDBC")

oracle

  1. 建序列
    create sequence 序列名 increment by 1 minvalue 1 no maxvalue start with 1;

  2. insert时id项的值为:
    序列名.nextval

    select 序列名.nextval from dual
    dual是虚拟表

  3. mybatis model配置,获取id值再进行insert操作
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select 序列名.nextval from dual")

  4. 查看所有序列
    select * from user_sequences;

软件相关

使用阿里云开源镜像

  • 备份旧的配置文件
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

  • 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

  • 并替换部分字段(非阿里云机器需要做)
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

  • 生成缓存
    yum makecache

rpm

  • 查看软件是否安装
    rpm -qa | grep 软件名

  • 查看软件安装路径
    rpm -ql 软件名

  • 安装软件
    rpm -ivh 软件包

  • 卸载软件
    rpm -e --nodeps 软件包

yum

  • 查看软件是否安装
    yum list installed | grep 软件名

  • 查看软件是否已安装以及相关软件包
    yum list 软件包*

  • 查看yum源软件包版本等信息
    yum info 软件包

  • 本地查找不到时
    yum search 软件包*

  • 安装软件
    yum install 软件包

  • 卸载软件
    yum remove 软件包

  • 软件依赖
    yum deplist 软件包

  • repo源文件位置
    cd /etc/yum.repos.d

进程相关

  • 进程信息排序
    top

  • 查看进程信息
    ps 进程id

  • 进入进程运行信息文件夹
    /proc/进程id

  • 查看进程源文件位置,其中”exe ->”指向的就是源文件位置
    ls -la /proc/进程id

  • 强制终止进程
    kill -9 进程id

  • 查看端口占用
    netstat -ntlp | grep 端口号/程序名

  • 后台运行任务
    nohup 任务命令 > log.txt &

  • 查看任务运行情况
    ps -ef | grep 任务命令 | grep -v grep

系统相关

  • 查看历史启动时间
    last reboot

ssh端口修改

  • 编辑配置文件
    vi /etc/ssh/sshd_config

  • 找到 #Port 22 一行,去除 # 号,并将 22 改为新的端口

  • 防火墙开放新端口

  • 重启sshd服务
    systemctl restart sshd

使用fail2ban

  • yum 安装
    yum install fail2ban

  • 自定义配置

    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
    vi /etc/fail2ban/jail.local

    [DEFAULT]
    # 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
    # 用于指定哪些地址可以忽略 fail2ban 防御
    ignoreip = 127.0.0.1/8
    logencoding=utf-8
    # 客户端主机被禁止的时长(秒)
    bantime = 36000
    # 查找失败次数的时长(秒)
    findtime = 36000
    # 客户端主机被禁止前允许失败的次数
    maxretry = 3

    # 一分钟内ssh密码错误3次禁止2小时
    [ssh-iptables]
    enabled = true
    filter = sshd
    action = iptables[name=SSH, port=ssh, protocol=tcp]
    # Debian 系的发行版
    logpath = /var/log/auth.log
    # Red Hat 系的发行版
    logpath = /var/log/secure
    maxretry = 3
    findtime = 60
    bantime = 7200
  • 重启服务
    systemctl restart fail2ban

  • 测试是否服务正常运行
    fail2ban-client ping
    Server replied: pong

  • 开机启动
    systemctl enable fail2ban

  • 版本查看
    fail2ban-client version

  • 查看sshd状态
    fail2ban-client status sshd

防火墙相关

  • 查看防火墙状态
    systemctl status firewalld

  • 查看开放的所有端口及协议
    firewall-cmd --zone=public --list-ports

  • 查看指定端口是否已开放
    firewall-cmd --query-port=端口号/协议(tcp/udp)

  • 永久开放指定端口号
    firewall-cmd --permanent --add-port=端口号/协议(tcp/udp)

    success表示成功

  • 永久移除指定端口号
    firewall-cmd --permanent --remove-port=端口号/协议(tcp/udp)

  • 重新载入防火墙配置(修改规则后,须执行此命令)
    firewall-cmd --reload

文件相关

  • 创建文件夹
    mkdir 文件加名称

  • 递归删除文件夹
    rm -rf 文件夹路径

  • 创建文件
    touch 文件名

  • 查看文件
    cat 文件名

  • 删除文件
    rm -f 文件名

  • 添加可执行权限
    chmod +x 文件夹或文件

  • 删除可执行权限
    chmod -x 文件夹或文件

vi相关

  • 打开文件
    vi 文件路径

  • 进入insert模式
    按i键

  • 进入command模式
    按esc键

  • 强制保存文件,并退出vi
    :wq!

  • 不保存文件,退出vi
    :q!

  • 保存文件但不退出vi
    :w!

  • 将修改另外保存到file中,不退出vi
    :w file

  • 放弃所有修改,从上次保存文件开始再编辑
    :e!

硬盘与文件系统

  • 查看硬盘label(别名)
    blkid

  • 查看硬盘大小
    lsblk

  • 查看分区信息
    fdisk -l

  • 查看硬盘占用
    df -h

  • 查看文件夹占用空间
    du -sh

  • 查看文件夹及下级文件占用空间(参数–max-depth用来指定深入目录的层数)
    du -h --mxa-depth=1

刷新DNS缓存

yum -y install nscd
systemctl start nscd
nscd -i hosts

无线网络配置

  • 安装 nmcli 工具
    yum install NetworkManager*

  • 重启网络服务
    systemctl restart NetworkManager

  • 查看网卡别名和网卡信息
    nmcli

  • 将无限网卡加入托管(命名可能不是wlp1s0)
    nmcli dev set wlp1s0

  • 开启wifi
    nmcli r wifi on

  • 扫描wifi
    nmcli dev wifi

  • 连接ssid
    nmcli --ask dev wifi connect SSID_NAME

  • 查看网卡状态
    nmcli dev status

  • 网卡命名规则

    en: eethernet 以太网-双绞线
    wl: wirelessLAN 无线网卡
    ww:WAN广域网 串行线缆
    
    o:on-board 板载网卡
    s: hotplug 热插拔
    p:PCI接口
    
    N:序号或者ID
    

替换openjdk

  • Oracle官网下载rpm安装包

  • 用rpm命令安装jkd
    rpm -ivh 安装包名称.rpm

  • 使用update-alternative配置java
    update-alternatives --config java
    update-alternatives --config javac

  • 查看当前jdk版本
    java -version
    javac -version

  • 查看jdk位置
    which java
    ls -lrt /usr/bin/java
    ls -lrt /etc/alternatives/java

  • 配置环境变量
    vim /etc/profile

  • 在末尾添加以下内容

    1
    2
    3
    4
    export JAVA_HOME="上面输出的路径,截止到jdk目录"
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
  • 更新profile
    source /etc/profile

  • 测试javahome
    echo $JAVA_HOME

使用tar.gz方式安装jdk

安装debug版本jdk,以支持更多命令
yum install -y java-1.8.0-openjdk-devel && yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

进程莫名停止,没异常信息

  • 查看message信息,是否内存不足被杀了
    cat /var/log/message

  • 解决方法:添加交换分区

  • 创建交换分区
    dd if=/dev/zero of=/usr/swap bs=1M count=2048 #在/usr目录下创建2g的文件swap,文件的大小是count的大小乘以bs大小
    mkswap /usr/swap #把新建的文件做成swap分区
    swapon /usr/swap #启用交换分区

  • 设置开机自动挂载
    vi /etc/fstab
    /usr/swap swap swap defaults 0 0

  • 查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成10或者30
    cat /proc/sys/vm/swappiness
    sysctl -w vm.swappiness=10

这里需要简单说明下,在Linux系统中,可以通过查看/proc/sys/vm/swappiness内容的值来确定系统对SWAP分区的使用原则。当swappiness内容的值为0时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用SWAP分区。当swappiness内容的值为100时,表示积极地使用SWAP分区,并且把内存中的数据及时地置换到SWAP分区。注:若想永久修改,则编辑/etc/sysctl.conf文件
我们这里设置的30,就表示当物理内存少于30%时便使用交换分区。

  • 关闭交换分区
    swapoff /usr/swap

  • 最重要一点,java项目不建议启用交换分区