【转载】在 Oracle 中设置自增列

database Oracle 【转载】在 Oracle 中设置自增列 如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它。 一、什么是自增列 ? 自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段,这样每次增加一行时,不用指该字段的值,它就会自动增加,而且是唯一的。 当在 MySQL 中定义列时,我们可以指定一个名为 AUTO_INCREMENT 的参数。然后,每当将新值插入此表中时,放入此列的值比最后一个值加 1。 但很不幸,Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢? 二、在 Oracle 11g 中设置自增字段 1. 创建表 首先创建一张用于测试的表: CREATE TABLE "TEST" ( ID NUMBER(11) PRIMARY KEY, NAME VARCHAR2(50BYTE) NOT NULL ); 2. 创建序列 然后创建一个名为 TEST_ID_SEQ 的序列(序列名称自己随意设定): CREATE SEQUENCE TEST_ID_SEQ INCREMENT BY 1 START WITH 100 MAXVALUE 999999999 NOCYCLE NOCACHE; 如果要删除序列,可以使用下面的 SQL 命令: DROP SEQUENCE TEST_ID_SEQ; 对 SEQUENCE 的一些说明: INCREMENT BY 用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。 START WITH 用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值,当序列号顺序递减时默认值为序列号的最大值。 MAXVALUE 用于指定序列生成器可以生成的组大序列号(必须大于或等于 START WITH,并且必须大于 MINVALUE),默认为 NOMAXVALUE。 MINVALUE 用于指定序列生成器可以生成的最小序列号(必须小于或等于 START WITH,并且必须小于 MAXVALUE),默认值为 NOMINVALUE。 CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为 NOCYCLE。 CACHE 用于指定在内存中可以预分配的序列号个数(默认值:20)。 到这一步其实就已经可以实现字段自增,只要插入的时候,将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了: ...

【转载】面向对象(深入)| python描述器详解

Python 【转载】面向对象(深入)| python描述器详解 本文分为如下部分 引言——用 @property 批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法、静态方法和类方法的描述器原理 property 装饰器的原理 描述器的应用 参考资料 引言 前面 python 面向对象的文章中我们讲到过,我们可以用 @property 装饰器将方法包装成属性,这样的属性,相比于其他属性有一个优点就是可以在对属性赋值时,进行变量检查,举例代码如下: class A: def __init__(self, name, score): self.name = name # 普通属性 self._score = score @property def score(self): return self._score @score.setter def score(self, value): print('setting score here') if isinstance(value, int): self._score = value else: print('please input an int') a = A('Bob',90) a.name # 'Bob' a.score # 90 a.name = 1 a.name # 1 ,名字本身不应该允许赋值为数字,但是这里无法控制其赋值 a.score = 83 a.score # 83,当赋值为数值型的时候,可以顺利运行 a.score = 'bob' # please input an int a.score # 83,赋值为字符串时,score没有被改变 当我们有很多这样的属性时,如果每一个都去使用 @property,代码就会过于冗余。如下 ...

ansible tower 的搭建

Linux Ansible ansible tower 的搭建 下载 axel https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-3.7.3-1.tar.gz -n 10 可能会出现:重定向过多 的问题,手动编译 axel 或者使用 wget 即可。 # 下载源码包 wget -O axel-2.16.1.tar.gz https://file.idait.cn/axel-2.16.1.tar.gz # 解压 tar xzvf axel-2.16.1.tar.gz # 进入目录 cd axel-2.16.1/ # 检查编译 ./configure --prefix=/usr/local/axel # 报错 No package 'openssl' found,则 yum install openssl-devel make && make install #报错请安装 gcc 工具 不报错请忽略 yum groupinstall "Development tools" #axel 执行路径 echo 'PATH=/usr/local/axel/bin:$PATH' > /etc/profile.d/axel.sh #使文件生效 . /etc/profile 配置并安装 cd /opt/ tar xf ansible-tower-setup-bundle-3.7.3-1.tar.gz cd ansible-tower-setup-bundle-3.7.3-1/ # 配置密码 vim inventory [tower] localhost ansible_connection=local [database] [all:vars] admin_password='abcdefg' pg_host='' pg_port='' pg_database='awx' pg_username='awx' pg_password='abcdefg' # 安装 ./setup.sh 破解 # 安装 pip cd /tmp axel https://bootstrap.pypa.io/get-pip.py -n 10 python get-pip.py # 安装 uncompyle6 pip install uncompyle6 cd /var/lib/awx/venv/awx/lib/python3.6/site-packages/tower_license ls -al 总用量 12 -rw-r--r-- 1 root root 8348 9月 28 16:00 __init__.pyc drwxr-xr-x 2 root root 37 11月 15 04:02 __pycache__ # 反汇编 init.pyc uncompyle6 __init__.pyc >__init__.py # 修改 __init__.py 文件 def _check_cloudforms_subscription(self): return True #添加这一行 if os.path.exists('/var/lib/awx/i18n.db'): return True else: if os.path.isdir('/opt/rh/cfme-appliance'): if os.path.isdir('/opt/rh/cfme-gemset'): pass try: has_rpms = subprocess.call(['rpm', '--quiet', '-q', 'cfme', 'cfme-appliance', 'cfme-gemset']) if has_rpms == 0: return True except OSError: pass return False .... # 修改 "license_date=253370764800L" 为 "license_date=253370764800" def _generate_cloudforms_subscription(self): self._attrs.update(dict(company_name='Red Hat CloudForms License', instance_count=MAX_INSTANCES, license_date=253370764800, #修改 license_key='xxxx', license_type='enterprise', subscription_name='Red Hat CloudForms License')) ... #------------------------------------------------------------------ #修改完重新编译一下 [root@tower tower_license]# python3 -m py_compile __init__.py [root@tower tower_license]# python3 -O -m py_compile __init__.py #重启服务 [root@tower tower_license]# ansible-tower-service restart

ansible vault 的使用

Linux Ops Ansible ansible vault 的使用 ansible 在某些特殊的操作,例如 become 提取操作,再或者有些配置文件有机密信息,不想明文保存,那么就需要用到 vault 这个工具。它随着 ansible 发行,调用方式为 ansible-vault。 在不是非常保密严格的场合,可以只配置 2-3 个 vault 密码,去加密 ansible 用到的所有文件。 现在假设当前目录下有以下文件: ansible.cfg hosts hello.yml 那么除了 ansible.cfg 不能被加密,其他数据都可以加密。相当于用一个密码隐藏另一堆机密数据。 模块说明 create: 创建一个新文件,并直接对其进行加密 decrypt: 解密文件 edit: 用于编辑 ansible-vault 加密过的文件 encrypy: 加密文件 encrypt_strin: 加密字符串,字符串从命令行获取 view: 查看经过加密的文件 rekey: 重新设置密码 每个模块都很容易理解。 每个模块的作用可以参考: ansible笔记(43):使用 ansible-vault 加密数据 Ansible 加密模块 Vault 使用方式 这里提供两种加密明文密码的使用姿势。 首先,我们需要创造一个 vault 的密码,这个密码可以人工创造,或者交给 openssl 自动生成,存储在特定文件里。 $ openssl rand -base64 100 > vault.pass 接着编辑 ansible.cfg 文件(该文件绝不能被 vault 加密)。 ...

ansible 运行持续进程及配置环境变量

Linux Ops Ansible ansible 运行持续进程及配置环境变量 配置环境变量 ansible 是通过 ssh 登陆的,同时也是 Non-Login 的方式登陆,这种登陆情况下,部分环境参数是拿不到的。Login 和 Non-Login 的区别可以参考 Difference between Login shell and Non login shell。 那么如果一行 shell 运行的指令需要用到环境参数该怎么处理? 根据 Non-Login shell 调用顺序,~/.bashrc 是会被调用的,所以可以想办法把参数文件写在 ~/.bashrc 中,这样就可以运行 shell。 另一种思路是,不想破坏系统的 ~/.bashrc 文件,或者环境变量本身也是经常变的,那么就自制一个文件,通过 source 启用,设想很好,但是实际操作不行,我这边的环境(ubuntu 18.04 server)提示 source:command not found。有些解释是,ansible 的 shell 不是 bash,没有 bash 的特性。 但 source 的方法不行,还有另一个方法,启用 environment。 --- - hosts: all remote_user: test gather_facts: True tasks: # 在需要环境的任务下,一一指定变量,在执行过程中会导入这些变量 - name: some command need environment shell: cmd: xxx yyy zzz chdir: /your/path environment: ARGS1: 1 ARGS: 2 后台持续运行 后台持续运行的方法很多,正规点的利用 supervisord,systemd 配置一个服务,让服务在后台运行,但这需要配置文件,有没有更好的处理方法,nohup 能否在 ansible 中使用,答案是:可以。 ...

api doc的使用和部署

[[apiDoc]] api doc 的使用和部署 做 web 应用,总绕不开前后端数据接口的对接。如何才能写出一份简单、易于维护的 api 文档? 这时候 api doc 就出现了。 apiDoc 是一个简单的 RESTful API 文档生成工具,它从代码注释中提取特定格式的内容,生成文档。 目前支持支持以下语言:C#、C/C++、D、Erlang、Go、Groovy、Java、JavaScript、Pascal/Delphi、 Perl、PHP、Python、Ruby、Rust、Scala 和 Swift。 以下的使用示例以 python 语言为主。 以下是官网APIDOC。 安装 npm install apidoc -g 设置apiDoc配置 在项目文件夹根目录创建文件 apidoc.json 文件。 里面的内容是对当前项目的描述。 其中 header 或者 footer 可以指向 md 文件,可以记录头信息和尾部信息。 { "name": "example", "version": "0.1.0", "description": "apiDoc basic example", "title": "Custom apiDoc browser title", "url" : "https://api.github.com/v1", "header": { "title": "Overview", "filename": "header.md" }, "footer": { "title": "Copyright", "filename": "footer.md" } } 创建 header.md 和 footer.md (非必须) 生成 api doc apidoc -i myapp/ -o apidoc/ -i 项目文件夹 -o apidoc文件夹 生成好了,就可以打开 apidoc/ 文件夹下的 index.html 就可以了。 ...

arp 实现网络传输速率倍增

Linux Network arp 实现网络传输速率倍增 测试目标 最近想要突破千兆交换机给定的极限,尝试过 bond6 实现,发现还是需要万兆交换机支持。 换个思路,先确定下目前的需求是什么: 一个主节点,配置了五个网口,每个网口配置一个 ip,定义为 192.168.1.1-5 五个普通节点,分别有一个网口且分配一个 ip,定义为 192.168.1.11-15 现在想达到的目标是: - 五个普通节点分别向主节点的不同 ip 发数据,使得主节点的网络吞吐(进口)达到 5000 Mb/s - 五个普通节点分别要求从主节点的不同 ip 取数据,使得主节点的网络吞吐(出口)达到 5000 Mb/s 测试方案也很简单,就是讲一个大文件通过 scp 传递或者要求接收的方式判断网络吞吐。 直观来看,这两个目标很容易达到,虽然连接在千兆交换机上,但是主节点连了五根线,理论可以达到 5000 Mb/s的。 实际测试过程 定义几个概念: 主节点称为 m 主节点的网口带上数字,记为 m1-m5 普通节点称为 s,五个即 s1-25 普通节点只有一个网络端口,所以网口和普通节点同名 定义两个测试过程: s1-s5 分别向 m1-m5 发送数据,记为实验一 s1-s5 分别要求 m1-m5 发送数据,记为实验二 实验结果是: 实验一的结果是,五个发送请求的带宽总和是 3000Mb/s 实验二的结果是,五个拉取请求的带宽总和是 1000Mb/s 这个结果令我有些不解,开始用工具监控数据,但不再聚焦于五个普通节点,而是专门去监控主节点的五个网口。 分析过程 主节点的五个网口的数据,实验一中,m1:1000,m2:1000,m3:3000,m4:0,m5:0;实验二中m3:1000,其他都是0。 分析到这里能解释实验现场,但是根本原因还不明确,往底层去看,可能是网络层和链路层的问题,随之想到了 arp 协议。 arp 协议定义了 ip 和 mac 地址的关系,先查下每台机器的 arp 信息,下面是大致的信息: ...

bash shell buildin command

Linux Shell bash shell buildin command 这里肤浅的以 bash 为例,实际概念应该是 shell buildin commond。 前几天,突发奇想,Linux 的可执行命令,例如 ls,cat,echo 都是可执行文件,一般在 /bin/ 下。但是 cd 却一直找不到(Ubuntu 18.04 server),通过 find 全盘搜索也找不到。 昨天在处理一个系统环境的问题时,发现 source 也找不到所在路径,就很好奇这到底是怎么了,系统如何知道 cd 或者 source 在哪里,在 path 路径中完全找不到。 在查找资料中,想起了一件事,所谓的 Linux 系统,是指 Linux 内核,而人和 Linux 打交道是通过 shell 实现的。所以 shell 可以更人性化,例如正则批量。而 source 也是 bash 的一个特性,用来导入环境变量。 可以通过 type 判断一个命令属于什么。 type: type [-afptP] name [name ...] Display information about command type. For each NAME, indicate how it would be interpreted if used as a command name. Options: -a display all locations containing an executable named NAME; includes aliases, builtins, and functions, if and only if the `-p' option is not also used -f suppress shell function lookup -P force a PATH search for each NAME, even if it is an alias, builtin, or function, and returns the name of the disk file that would be executed -p returns either the name of the disk file that would be executed, or nothing if `type -t NAME' would not return `file' -t output a single word which is one of `alias', `keyword', `function', `builtin', `file' or `', if NAME is an alias, shell reserved word, shell function, shell builtin, disk file, or not found, respectively Arguments: NAME Command name to be interpreted. Exit Status: Returns success if all of the NAMEs are found; fails if any are not found. $ type -a cd cd is a shell builtin $ type -a source source is a shell builtin $ type -a echo echo is a shell builtin echo is /bin/echo 可以看到 echo 是内建命令,但也是系统命令,那么会使用哪一个呢。 ...

bumpversion的简单学习

Python Python Module bumpversion 的简单学习 如果只是闭门造车,写点小脚本的话可以不用在意版本的问题。 但是一旦脚本或者项目需要被他人使用,如果没有版本信息,又出现了 bug,那么你很难定位他使用的是什么版本,这个 bug 到底有没有修复,有了版本信息你可以很确定一些 feather 或者 bug 是否实现。 最简单的版本信息制作,在项目下新建一个 VERSION 文件,在该文件中记录版本号,做了些代码修改就手动修改 VERSION。 但是这样会带来更多问题,你只能在修改过 VERSION 后做个 git commit 才能够更好地跟踪;多个文件会提到版本信息该怎么处理;大版本和 patch 版本如何区分? bumpversion 横空出世,给上述的问题给了些答案。Bumpversion 是一个简化工程版本号修改的工具,可以通过 pip 安装。使用它可以一键将当前工程的文件中的旧版本号替换成新版本号还可以顺便 Commit 和 打上 Tag(如有需要)。 语法 bumpversion [options] part [file] 这里面 part 是关键,它可以简化很多事。 使用 先看一个简单的例子: 工程里有 main.py 和 Makefile 两个文件。 main.py 打印当前的版本号: version = '0.0.1' if __name__ == '__main__': print(version) Makefile 将 py 文件压缩起来: VERSION = 0.0.1 .PHONY: build build: tar zcvf tellversion-v$(VERSION).tar.gz main.py 要使用 Bumpversion 需要在目录里添加 .bumpversion.cfg 文件: ...

centos-root LVM 扩容问题

Linux [[CentOS]] file system centos-root LVM 扩容问题 最近开了一个 jumpserver 服务,突然挂了,一查原来是系统的根目录只有50G,数据写不下了,只剩 40k 的空间。好在 centos7 默认使用 LVM 进行文件系统的挂载,那只有加盘了。 加上 1 TiB 的硬盘,通过 pvcreate /dev/sdb ,出现 Device /dev/sdb excluded by a filter。此时因为该盘可能因为有分区,所以不行,可以尝试 wipefs -a /dev/sdb 来解决问题。 然后再让 vg:centos 增加一块 pv :vgextend centos /dev/sdb。此时可能会出现 Couldn't create temporary archive name。这是因为根目录可用空间太少了,删点日志再执行这个指令就可以了。 接着 vg 就有可用空间了,使用 lvextend 增加容量:lvextend -L +1024G /dev/mapper/centos-root。这里一般不会有什么问题,会直接通过。 但是上部操作完成后,查看 df -h 还是只有 50G,因为没有让系统知道这件事。国内的资料显示需要执行:e2fsck -f /dev/mapper/centos-root 和 resize2fs /dev/mapper/centos-root。但我执行都不可以,会说 root 已经挂载,那么只能在维护模式下使用?那不就还是要重启? 在一篇英文资料中提到,可以执行 fsadm resize /dev/centos/root 通知系统文件系统大小已经变更。 ...