• Oracle备忘录


    习惯是一个数据库中有多个用户,但是一个用户对应一个系统

    数据库管理员主要职责:

    每个Oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分担不同的管理职责。那么一个数据库管理员的主要工作是什么呢?
    安装升级Oracle数据库
    建库,表空间,表,视图,索引。。。
    制定并实施备份和修复计划
    数据库权限管理,调优,故障排除
    对于高级dba,要求参与项目开发,会编写sql语句,存储过程,触发器,规则,约束,包
    --显示当前数据库的全称
    select * from global_name;
    sysdba:即数据库管理员权限,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制、管理功能、创建数据库。  sys  用户必须用sysdba身份才能登录,  system  用户可以用普通身份登录。
    1.关闭数据库:shutdown immediate;
    2.启动数据库:startup;
    3.设为归档:alter database archivelog;
    4.设为非归档:alter database noarchivelog;
    5.打开数据库:alter database open;
    sysyoper:即数据库操作员权限,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。
    normal:即普通用户权限,权限只有查询某些数据表的数据。默认的身份是normal用户。
    两个主要的用户,三个重要权限(角色):
    sysdba(相当于sys)>sysoper>dba(相当于system)
    (sys好像是董事长,system好像是总经理,董事长比总经理大,但是通常是总经理干事)在前面我们已经提到这两个用户,区别主要是:
    1.最重要的区别,存储的数据的重要性不同
    sys:所有Oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于Oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手动更改。sys用户拥有dba,sysoper,sysdba的角色或权限,是Oracle权限最高的用户。system:用于存放次一级的内部数据,如Oracle的一些特性或工具的管理信息。system用户拥有dba,sysoper,sysdba(as sysdba登录时)的角色或权限。sysdba权限下可以建数据库,sysoper权限不能建数据库
    2. 其次的区别,权限的不同。
    sys  用户必须以  as sysdba  或  as sysoper  形式登录。不能以normal方式登录数据库,system如果正常登录,它其实就是一个普通的dba权限用户,但是如果以as sysdba登录,其结果实际上它是作为sys用户登录的
    sysdba和sysoper权限区别:
    只要是sysoper拥有的权限,sysdba都有。(它们的最大区别是:sysdba可以创建数据库,sysoper不可以创建数据库)
    dba权限的用户:
    dba用户是指具有dba角色的数据库用户。特权用户可以执行启动实例,关闭实例等特殊操作,而dba用户只有在启动数据库后才能执行各种管理工作。(相当于说dba连startup和shutdown这两个权限都没有)

    丢失管理员密码怎么办:
    恢复办法:把原有密码文件删除,生成一个新的密码文件。
    恢复步骤如下:
    ① 搜索名为  PWD+数据库名称.ora  文件
    ② 删除该文件,为预防万一,建议大家备份
    ③ 生成新的密码文件,在dos控制台下输入命令:
    orapwd file=原来密码文件的全路径密码文件名.ora password=新密码 entries=10;//entries:允许几个特权用户
    密码文件名  一定要和原来的密码文件名一样,默认是  PWD+数据库名称。
    1.Oracle认证,与其它数据库比较,安装
    Oracle安装会自动的生成sys用户和system用户:
    (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install
    (2)system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是manager
    (3)一般讲,对数据库维护,使用system用户登录就可以啦
    也就是说sys和system这两个用户最大的区别是在于有没有create database的权限。
    文件操作命令
    1.start
    start E: est.sql;--运行sql脚本
    2.edit
    edit E: est.sql;--该命令可以编辑指定的sql脚本 这样会把E: est.sql这个文件打开
    3.spool
    spool E: est.sql; 并输入随意的sql命令,如select * from tb_Employee;然后spool off;-- 该命令可以将sql*plus屏幕上的内容输出到指定文件中去。
    show linesize;--显示行的宽度,默认值为80
    set linesize number;--设置行的宽度为number
    set pagesize number;--设置每页显示的行数,默认值为14

    用户、角色

    create user  db_user identified by db_user_pw;--创建用户,要在dba权限用户下进行操作
    show user;--显示当前用户名
    drop user db_user cascade;--删除用户
    select * from all_users;--查看所有用户
    select * from dba_users;--显示所有的dba用户,前提是你有dba权限,如sys,system用户
    select * from user_users;--查看当前用户信息
    select * from dba_role_privs where grantee='db_user';--显示用户具有的角色,dba权限用户

    create role db_role not identified;--创建角色时不需要输入密码即可登录
    create role db_role identified by db_role_pw;  --创建角色
    drop role db_role; --删除角色
    grant db_role to db_user;--将角色赋给用户
    select * from dba_roles;--显示所有的角色,前提是你有dba权限,如sys,system用户

    修改用户密码,passw也可以写成password,1,2用来修改当前用户密码,3,4dba权限用户修改其他用户密码
    passw;--1,修改用户密码
    passw db_user;--2,修改用户密码
    passw db_user;--3,dba权限用户修改其他用户密码
    alter user db_user identified by db_user_pw;--4,dba权限用户修改其他用户密码

    conn db_user/db_user_pw;--连接数据库
    conn sys/change_on_install as sysdba;--作为系统数据库管理员登录
    disc;--该命令用来断开与当前数据库的连接
    exit;--该命令会断开与数据库的连接,同时会退出命令窗口
    set timing on; --打开显示操作时间的开关,在下面显示查询时间。
    show parameter db_;--查询包含db_的参数,在dba权限用户操作

    数据字典

    介绍:数据字典是什么
    数据字典是Oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息。动态性能视图记载了例程启动后的相关信息。
    数据字典
    select * from dict where comments like '%grant%';--显示当前用户可以访问的所有数据字典视图
    数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为sys用户。用户只能在数据字典上执行查询操作(select语句),而其维护和修改是由系统自动完成的。这里我们谈谈数据字典的组成:数据字典包括数据字典基表和数据字典视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表。数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括all_xxx,dba_xxx,user_xxx三种类型。
    all_tables;--用于显示当前用户可以访问的所有表,它不仅会返回当前用户方案的所有表,还会返回当前用户可以访问的其它方案的表
    dba_tables;--它会显示所有方案拥有的数据库表。但是查询这种数据库字典视图,要求用户必须是dba角色或是有select any table系统权限。
    user_tables;--用于显示当前用户所拥有的所有表,它只返回用户所对应方案的所有表 比如:select table_name from user_tables;
    select table_name from user_tables;--显示当前用户下的所有表:(user_tab_comments)
    select * from user_tab_columns;--查询用户下所有字段
    select table_name from all_tables;--显示当前用户可以访问的所有表:
    select table_name from dba_tables;--显示数据库中全部的表,必须是dba或者具有select any table的权限
    例如:当用system用户查询数据字典视图dba_tables时,会返回system,sys...方案所对应的数据库表。
    select view_name from user_views;--显示当前用户下的所有视图:(all_views where owner='db_user')
    create profile lock_account limit failed_login_attempts num1 password_lock_time num2;--建立输入密码错误次数达到num1时锁定规定时间num2
    create profile password_life_timename limit password_life_time num1 password_grace_time num2 password_reuse_time num3;--建立在num1天之后修改密码,宽限天数为num2,在num3天后可以重用
    drop profile profilename cascade;--删除文件
    alter user  db_user profile profilename; --对某用户实行这一锁定规则 
    alter user  db_user account unclok;--进行解锁
    TPL(事务处理语言):
    savepoint a;--设置回滚点,保存点,可预防数据库重要信息的丢失,保存点个数没有限制(可以设置多个回滚点)
    rollback to a;--回滚到这个点
    rollback;--回滚到最初的状态
    commit;--提交,每天都必须的操作,但是会删除全部保存点,释放锁,谨慎使用,使用时确保数据库已经不存在问题!
    --事务处理集只读操作
    set translate read only;

    导出:
    导出表,导出方案,导出数据库
    exp命令,要从命令行进入Oracle中的bin 目录
    user id,tables,owner,full=y,inctype,rows,file
    导出表的结构而不导入数据:
    exp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp rows=n
    导出表:
    exp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp
    下面这种方式导出块
    exp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp direct=y
    导出方案:
    exp user id=system/manager@XE owner=system file=E:exptest b_Employee.dmp
    导出全部:
    exp user id=system/manager@XE full=y inctype=complete file=E:exptest b_Employee.dmp
    导入表的结构,而不导入表的数据:
    imp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp rows=n
    导入表:
    imp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp
    导入数据,如果表已经存在只导入数据:
    imp user id=system/manager@XE tables=(tb_Employee) file=E:exptest b_Employee.dmp ignore y
    导入表到其他用户
    imp user id=system/manager@XE table=tb_Employee file=E:exptest b_Employee.dmp touser=system;
    导入数据库:
    imp user id=system/manager@XE full=y file=E:exptest b_Employee.dmp touser=system;

    磁盘损坏时的做法:
    确定数据文件所在的表空间:
    select tablespace_name from dba_data_files where filename='E: ablespace_name.dbf';
    使表空间脱机:
    alter tablespace tablespace_name offline;
    移动表空间:
    host move E: ablespace_name.dbf newtype: ablespace_name.dbf
    对数据库文件进行逻辑修改:
    alter tablespace tablespace_name rename datafile 'E: ablespace_name.dbf to newtype: ablespace_name.dbf';
    使得表空间联机:
    alter tablespace tablespace_name online;

    表级定义:
    在定义了列之后添加约束
    列级定义:
    在定义列的同时添加约束

    set serveroutput on;--开启显示内容,不开启内容不会显示

    set serveroutput off--关闭显示内容
    定义常量时,建议用v_作为前缀v_sal
    定义常量时,建议用c_作为前缀c_rate
    当定义游标时,建议用_cursor作为后缀EMP_cursor
    当定义例外时,建议用e_作为前缀e_error

    --直接输入对应的内容
    begin
    dbms_output.put_line('helloworld');
    end;
    / --这个最后在加上

    --for循环
    begin
    for i in reverse 1..10 loop
    dbms_output.put_line('helloworld');
    end loop;
    end;
    /

    --查看是否有某个雇员号
    begin
    delete from tb_Employee
    where pk_Employee_ID = 47;
    if sql%notfound then
    dbms_output.put_line('未找到值');
    else
    dbms_output.put_line('已经删除');
    end if;
    end;
    /

    --声明,输入雇员号,显示雇员名,工资
    declare
    v_ename varchar2(5);
    v_sal number(7,2);
    begin
    select ename,sal into v_ename,v_sal from tb_Employee where pk_Employee_ID=&no;
    dbms_output.put_line('雇员名是:'||v_ename||',工资是:'||v_sal);--输出
    exception--异常处理
    when no_data_found then
    dbms_output.put_line('查无此人,请重新输入!');
    end;
    /

    --声明,输入雇员号,显示雇员姓名、工资、个人所得税,税率为0.03为例
    declare
    c_tax_rate number(3,2):=0.03;
    v_name varchar2(5);--tb_Employee.ename%type
    v_sal number(7,2);--tb_Employee.sal%type
    v_tax_sal number(7,2);
    begin
    select ename,sal into v_name,v_sal from tb_Employee where pk_Employee_ID=&no;--执行
    v_tax_sal:=v_sal*c_tax_rate;--注意冒号,--计算个人所得税
    dbms_output.put_line('雇员名是:'||v_name||',工资是:'||v_sal||',需要交的个人所得税是:'||v_tax_sal);
    end;
    /

    --类似于高级语言中的结构体
    --PL/SQL记录实例
    declare
    --表示要定义一个PL/SQL记录类型 emp_record_type,类型包含name,salary,title
    type emp_record_type is record(
    name tb_Employee.ename%type,
    salary tb_Employee.sal%type,
    title tb_Employee.job%type
    );
    --定义了一个变量,这个变量的类型是emp_record_type
    fj_record emp_record_type;
    begin
    select ename,sal,job into fj_record from tb_Employee where pk_Employee_ID=7788;
    dbms_output.put_line('雇员名是:'||fj_record.name||',工资是:'||fj_record.salary);
    end;
    /

    --相当于高级语言中的数组
    declare
    type fi_table_type is table of tb_Employee.ename%type --定义了一个PL/SLQL表类型,该类型是用于存放emp.ename%type
    index by binary_integer;--代表下标是按整数排序的,可以为负数
    fi_table fi_table_type;
    begin
    select ename into fi_table(0) from tb_Employee where pk_Employee_ID=7788;
    dbms_output.put_line('雇员名是:'||fi_table(0));--下标跟上面的下标一样
    end;
    /

    实现功能

    --输出变量的值
    declare
    i varchar2(100);
    begin
    i:=&no;
    dbms_output.put_line('变量i='||i);
    end;
    /

    --圆面积
    declare
    pi number:=3.14; --圆周率长值 ①
    table_name number default &no; --圆的半径默认值3 ②
    area number; --面积。
    begin
    area:=pi*table_name*table_name; --计算面积
    dbms_output.put_line('半径为'||table_name||'的面积'||area); --输出圆的面积
    end;
    /

    --执行 1+2+3+…+100 的值
    declare
    counter number(3):=0;
    sumResult number:=0;
    begin
    loop
    counter := counter+1;
    sumResult := sumResult+counter;
    if counter>=100 then
    exit;
    end if;
    -- exit when counter>=100;
    end loop;
    dbms_output.put_line('总和为:'||sumResult);
    end;
    /
    --或者下面这样:
    declare
    counter number(3):=0;
    sumResult number:=0;
    begin
    while counter<100 loop
    counter := counter+1;
    sumResult := sumResult+counter;
    end loop;
    dbms_output.put_line('总和为:'||sumResult);
    end;
    /
    --或者下面这样:
    declare
    counter number(3):=0;
    sumResult number:=0;
    begin
    for counter in 1..100 loop
    sumResult := sumResult+counter;
    end loop;
    dbms_output.put_line('总和为:'||sumResult);
    end;
    /

    --数位和
    declare
    num number;
    t number;
    now number;
    s number;
    begin
    num:=&no;
    t:=num;
    s:=0;
    while num>=1 loop
    now:=mod(num,10);
    s:=s+now;
    num:=floor(num/10);
    end loop;
    dbms_output.put_line('数字'||t||'的数位和为:'||s);
    end;
    /

    --判断是否是偶数
    declare
    v_char1 varchar2(100);
    begin
    v_char1 :='&no';
    dbms_output.put_line('输入的数字为:'||v_char1);
    if mod(v_char1,2)<>0 then
    dbms_output.put_line(v_char1||'不是偶数');
    else
    dbms_output.put_line(v_char1||'是偶数');
    end if;
    end;
    /

    ---编写一个匿名程序块,来计算一个随机整数是不是素数
    declare
    x number;
    i number;
    flag boolean;
    begin
    x  := trunc(dbms_random.value(0, 100));
    i := 2;
    flag := true;
    loop
    if mod(x, i) = 0
    then flag := false;
    end if;
    exit when x = 2 or i > sqrt(x) or flag = false;
    i := i + 1; 
    end loop;
    if(flag) then dbms_output.put_line(x || ' is a prime');
    else dbms_output.put_line(x || ' is not a prime');
    end if;
    end;
    /

    --判断1到200的素数,可拓展
    declare
    v_num number;
    v_now number;
    v_yes number;
    c_max number;
    begin 
    v_num:=1; 
    c_max:=200;--这里设置最大数,想要100这内就写100,想要1000之内就写1000 
    loop
    v_now:=2;--这里设置每一个数的初始被除数,从2开始
    v_yes:=1;--设置初始参考数,1为素数,0为非素数,默认初始为1
    if v_num<4 then 
    dbms_output.put_line(v_num);--1到3都是素数,这里就不再判断了
    v_num:=v_num+1;--自增1
    end if;
    if v_num>=4 then 
    --这里开始判断,只能被1和本身整除的数,就是素数 
    loop
    if mod(v_num,v_now)=0 and v_num<>v_now then --如果有能被整除的数,且被除数不是除数本身,就不是素数 
    v_yes:=0;
    end if;
    v_now:=v_now+1;--被除数递增
    exit when v_now>=v_num;--当被除数大于除数时退出 
    end loop;--因为要一个一个的判断,所以要来一次循环
    end if;
    if v_num>4 and v_yes=1 then 
    dbms_output.put_line(v_num);
    v_num:=v_num+1;--自增
    end if;
    v_num:=v_num+1;--自增
    exit when v_num>=c_max; 
    end loop;
    end;
    /

    --影响的行数
    declare
    li_count number;
    begin
    update tb_Employee
    set comm = 10;
    li_count:=sql%rowcount;
    dbms_output.put_line('影响的行数:'||li_count);
    commit;
    end;
    /

    -- 定义一个替换变量,用于接收一个字符串,字符串的每个子项为一个字符串,之间用逗号隔开。程序用于提取每个子串,并每行输出一个子串
    declare
    str varchar(30) := '&str';
    len int;
    pos int;
    lastpos int := 1;
    begin
    len := length(trim(translate(str, replace(str,','),' ')));
    for i in 1..len
    loop
    pos := instr(str, ',', 1, i);
    dbms_output.put_line(substr(str, lastpos, pos - lastpos));
    lastpos := pos + 1;
    end loop;
    dbms_output.put_line(substr(str, lastpos, length(str) - lastpos + 1));
    end;
    /
    -- 编写一个嵌套的程序块,在内部块中使用外部块的同名变量
    declare
    v_out varchar2(40);
    begin
    v_out:=to_char('&str');
    declare
    begin
    dbms_output.put_line('使用外部块的同名变量');
    end;
    end;
    /

    --输入一个值进行显示
    declare
    my_var varchar(30);
    begin
    my_var:='&input';
    dbms_output.put_line('输入的值是:'||my_var);
    exception
    when others then
    dbms_output.put_line('sqlerror');
    end;
    /

    --赋予一个默认值
    declare
    my_var number default 1;
    begin
    dbms_output.put_line('默认值是:'||my_var);
    my_var:=2;
    dbms_output.put_line('改变值是:'||my_var);
    end;
    /

    --if=,else,end if判断是否为false
    declare
    my_var boolean default true;
    begin
    if nvl(my_var,false) then
    dbms_output.put_line('不是false');
    else
    dbms_output.put_line('是false');
    end if;
    end;
    /

    --case测试
    begin
    case true
    when (1>3) then
    dbms_output.put_line('1>3 is true');
    when (1=2) then
    dbms_output.put_line('1=2 is false');
    when (3>1) then
    dbms_output.put_line('3>1 is true');
    else
    dbms_output.put_line('nothig work');
    end case;
    end;
    /

    层次查询:查询每个部门中每种职位的总工资,以及每个部分的总工资,整个公司的总工资
    select deptno,job,sum(sal) from tb_Employee group by rollup(deptno,job);

    查询每个部门,职位的总工资, 每个部门的总工资,每个职位的总工资,整个公司的总工资
    select deptno,job,sum(sal) from tb_Employee group by cube(deptno,job);

    建立一个除jod等于CLERK和ename等于SMITH及SMITH的下属员工之外公司管理层次报表,开始位置为公司的最高管理人,即mgr为空
    select ename,deptno,mgr from tb_Employee
    where job<> 'CLERK'
    start with mgr is null
    connect by prior pk_Employee_ID=mgr
    and ename <>'SMITH';

    使用层次查询和level伪列查询公司管理层次图
    select tb_Employee.ename,level from tb_Employee start with tb_Employee.pk_Employee_ID=7839
    connect by prior tb_Employee.pk_Employee_ID=tb_Employee.mgr order by level;
    select tb_Employee.ename,sys_connect_by_path(tb_Employee.ename,'/')
    from tb_Employee start with tb_Employee.pk_Employee_ID=7839 connect by prior tb_Employee.pk_Employee_ID=tb_Employee.mgr order by level;

    使用grouping和grouping_id两个函数,在合适的地方写上部门小计,职位小计和总计
    select case grouping(deptno)*2+grouping(job)
    when 1 then '部门小计'
    when 3 then '总计'
    end ,deptno,job,sum(salary) from tb_Employee group by rollup(deptno,job);
    select case grouping_id(deptno,job)
    when 1 then '部门小计'
    when 3 then '总计'
    when 2 then '职位总计'
    end ,deptno,job,sum(salary) from tb_Employee group by cube(deptno,job);

    试题

    填空

    1.Oracle有(内置函数)和(用户自定义函数)两种函数
    2.逻辑运算符中优先级最高的是(not)最低的是(or)
    3.Oracle数据库中的字符串连接符是(||)
    4.当对一个表定义一个主键时,系统自动会为该表建立(unique)索引
    5.rollup操作符中一共有n个表达式,一共要执行(n+1)次grouping操作
    6.当一个select语句块在一条查询语句多次使用时,我们可以使用(with)子句来提高性能
    7.正则表达式{m,n}、||,分别表示(匹配一个字符至少n次 最多m次),(或)
    8.Oracle数据库系统由(数据库、实例)组成。
    9.Oracle数据库具有3种主要类型的文件,分别是:(数据文件、日志文件、控制文件)。
    10.Oracle内存结构主要分为 (SGA、PGA) 。【Oracle内存结构分为:软件代码区,系统全局区(包括数据库缓冲存储区、日志缓冲区和共享池), 程序全局区(包括栈区和数据区),排序区】
    11.Oracle逻辑存储结构包括(表空间、段、数据块、区间)
    12.默认登录到Oracle enterprise manager database control 的端口号是(5560)
    13.常见的后台进程LGWR的作用(日志写入程序)【将redo写入日志文件】【归档是指将处理完毕且具有保存价值的事情或文件经系统整理后保存备案的过程。】
    14.初始化参数DB_BLOCK_SIZE的作用是(标准数据块大小 )
    15.Oracle 10G中G代表意思是(网格计算)【G代表Grid technology也就是时下流行的网格计算技术。之前的8i 和 9i 等,i 代表的是 internet】

    判断

    对一个表建立索引会改变表中行的内部顺序(F)
    delete可以有选择的删除记录,使用rollback语句可以取消这个命令的执行(T)
    使用alter table命令的add选项向一个已存在的表中添加一个新的属性列时,新列的每一行最初的值均为null。只有当一个表还没有行的时候,才可以对添加的列用not null约束。(T)
    SGA是针对某一服务器进程而保留的内存区域,它是不可以共享的 (F)
    create table <table name> as select能够创建一个复制表对象(T)
    to_char函数可以将数字和日期转变成字符(T)
    建立视图时,如果使用了with check option子句,则不能通过该视图来修改数据(F)
    minus和intersect分操作符分别表示“交”和“差”(F)
    tablespace是Oracle数据库中最大的逻辑存储单位(T)
    数据块只能基于表或视图。(×)【还可以是索引】
    我们使用alter table命令的add选项向一个已存在的表中添加一个新的属性列时,新列的每一行最初的值均为null。只有当一个表还没有行的时候,我们才可以对添加的列用not null约束。(×)
    Oracle进程就是服务器进程(×)
    【Oracle进程分为:后台进程和服务器进程。Oracle后台进程:数据库写入DBWn、进程监控PMON、检查点CKPT、日志写入LGWR、系统监控SMON、归档ARCn服务器进程是处理用户与实例连接的事务。】
    Oracle数据库系统中数据块的大小与操作系统有关(√)
    PL/SQL中游标的数据是可以改变的(√)【参数不同的话】
    一个数据文件中可以存在多个表,同样一个表也可以存在多个数据文件上。(×)
    使用having子句是为了限制group by子句返回的行的个数。(√)
    Oracle进程又分为两类:用户进程和后台进程。(×)【进程分为用户进程和Oracle进程】

    问答

    1、绑定变量是什么?绑定变量有什么优缺点?
    绑定变量是指在SQL语句中使用变量,改变变量的值来改变SQL语句的执行结果。
    优点:使用绑定变量,可以减少SQL语句的解析,能减少数据库引擎消耗在SQL语句解析上的资源。提高了编程效率和可靠性。减少访问数据库的次数, 就能实际上减少Oracle的工作量。
    缺点:经常需要使用动态SQL的写法,由于参数的不同,可能SQL的执行效率不同;

    绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。 
    优点是减少硬解析,降低CPU的争用,节省shared_pool 
    缺点是不能使用histogram,sql优化比较困难
    2、简单描述tablespace / segment / extent / block之间的关系
    tablespace: 一个数据库划分为一个或多个逻辑单位,该逻辑单位成为表空间;每一个表空间可能包含一个或多个 Segment;
    segments: Segment指在tablespace中为特定逻辑存储结构分配的空间。每一个段是由一个或多个extent组成。包括数据段、索引段、回滚段和临时段。
    extents: 一个 extent 由一系列连续的 Oracle blocks组成.Oracle为通过extent 来给segment分配空间。
    data blocks:Oracle 数据库最小的I/O存储单位,一个data block对应一个或多个分配给data file的操作系统块。
    table创建时,默认创建了一个data segment,每个data segment含有min extents指定的extents数,每个extent据据表空间的存储参数分配一定数量的blocks
    3、日志的作用是什么?
    日志文件(Log File)记录所有对数据库数据的修改,主要是保护数据库以防止故障,以及恢复数据时使用。其特点如下:
      column_name)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员。
      b)日志文件组以循环方式进行写操作。
      c)每一个日志文件成员对应一个物理文件。
    记录数据库事务,最大限度地保证数据的一致性与安全性  
    重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复,一个数据库至少需要两个重做日志文件 
    归档日志文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
    4、Oracle系统进程主要有哪些,作用是什么?
    数据写进程(DBWR):负责将更改的数据从数据库缓冲区高速缓存写入数据文件
    日志写进程(LGWR):将重做日志缓冲区中的更改写入在线重做日志文件
    系统监控  (SMON): 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
    进程监控  (PMON): 负责在一个Oracle 进程失败时清理资源
    检查点进程(CKPT):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
    归档进程  (ARCH):在每次日志切换时把已满的日志组进行备份或归档
    恢复进程  (RECO): 保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;
    作业调度器(CJQ ):  负责将调度与执行系统中已定义好的job,完成一些预定义的工作.
    1.Oracle得到广大用户的青睐原因在于:支持多用户、大事务量的事务处理、提供标准操作接口、实施安全性控制和完整性控制、支持分布式数据处理、具有可移值性、可兼容性和可连接性。数据库新特性:网络计算、真正集群技术、自动存储管理、数据库自动管理、高可用性、超大型数据库支持、闪回查询与闪回操作、物化视图与查询重写、数据泵
    2.数据库的应用系统结构主要分为4种:客户机/服务器结构(c/s:两层结构,客户机与服务器可采用不同的软硬件系统,应用于服务分离安全性高)、浏览器/服务器结构(b/s:三层结构,通过web服务器处理应用程序逻辑,方便了应用程序的维护和升级)、分布式数据库系统结构(数据分布,数据共享,兼容性好,网络扩展性好)、终端-服务器结构(便于集中管理,系统安全性高,网络负荷低)。
    3.数据库服务器企业版、标准版、个人版区别:①企业版数据库服务器包含所有的数据库组件,主要针对高端的应用环境,适用于安全性和性能要求较高的联机事务处理(OLTP)、查询密集型的数据仓库和要求较高的Internet应用程序②标准版数据库服务器提供大部分核心的数据库功能和特性,适合于工作组或部门级的应用程序:③个人版数据库服务器只提供基本数据库管理功能和特性,适合单用户的开发环境,为用户提供开发测试平台。
    4.数据库系统服务有:作业管理服务,数据库控制台服务,isql*plus管理服务,网络监听服务,实例服务。
    5.创建数据库的方法的比较:①使用数据库配置助手(DBCA)创建:是Oracle提供的用于创建数据库的图形界面工具,内置数据库模板,可以直观快速地创建数据库,适合初学者。②运行脚本手动创建:使用create database 语句和Oracle预定义脚本手动创建数据库,比DBCA方式具有更大的灵活性和效率,适合有经验的DBA
    6. 数据库启动步骤:①创建并启动实例:根据数据库初始化参数文件,为数据库创建实例,启动一系列后台进程和服务进程。②装载数据库:实例打开数据库的控制文件,从中获取数据库名称、数据文件和重做日志文件的位置、名称等数据库物理结构信息。③打开数据库:实例打开所有处于联机状态的数据文件和重做日志文件。手动创建数据库通常包含如下的操作步骤:1.确定新建数据库名称与实例名称;2.确数据库管理员的认证方式;3.创建初始化参数文件;4.创建实例;5.连接并启动实例;6.使用create DATABASE语句创建数据库;7.创建附加的表空8.运行脚本创建数据字典视图
    拓展:数据库启动的四个阶段:1、shutdown->on mount;2、on mount->mount;3、startup mount;4、open(打开找到的文件)
    数据库启动的四个步骤:1、数据库处于shutdown状态;2、数据库处于on mount状态;3、
    数据库处于mount状态;4、数据库处于open状态
    7.文本初始化参数文件:是一个本地的初始化参数文件,无论启动本地或远程数据库,都需要读取一个本地的初始化参数文件,并使用其中的设置来配置数据库和实例,文本参数文件的修改是通过直接对文本的修改实现的,通过命令行是无法将修改后的参数值写入该文件中。服务器初始化参数文件:是一个保存在数据库服务器端的二进制文件。远程启动数据库实例时,不需要在客户机保存一份初始化参数文件。服务器初始化参数文件是不能直接修改的,必须通过ALTER SYSTEM语句来进行参数修改的。
    8.数据库物理存储结构包括:数据文件、控制文件、重做日志文件、数据库的归档、口令文件等。数据文件:用于存储数据库中的所有数据。控制文件:控制文件保存数据库的物理结构信息,包括数据库名称、数据文件的名称与状态、重做日志文件的名称与状态等。在数据库启动时,数据库实例依赖初始化参数定位控制文件,然后根据控制文件的信息加载数据文件和重做日志文件,最后打开数据文件和重做日志文件。重做日志文件:重做日志文件是以重做记录的形式记录、保存用户对数据库所进行的修改操作,包括用户执行DDL、DML语句的操作。如果用户只对数据库进行查询操作,那么查询信息是不会记录到重做日志文件中的。归档文件:用于保存已经写满的重做日志文件。数据库逻辑存储结构分为数据块、区、段和表空间四种。其中,数据块是数据库中的最小I/O单元,由若干个连续的数据块组成的区是数据库中最小的存储分配单元,由若干个区形成的段是相同类型数据的存储分配区域,由若干个段形成的表空间是最大的逻辑存储单元,所有的表空间构成一个数据库。
    9. Oracle数据库体系结构由物理存储结构、逻辑存储结构和实例组成。其中物理存储结构描述了操作系统层次数据的存储与管理,包括数据文件、日志文件、重做日志文件等组成。逻辑结构描述了数据库内部数据的组织与管理,由表空间、段、区、块组成。实例是数据库运行的软件结构,由内存结构和后台进程组成。数据库运行过程中,用户的操作在内存区中进行,最终通过后台进行转化为对数据库的操作。
    10. 回退段的作用:利用回退段中保存的信息,可以实现事务回滚、数据库恢复和数据的读一致性。回退段的管理有两种方式,即自动撤销管理和手动撤销管理。
    11. 数据库实例是数据库系统的软件结构,由内存结构与后台进程组成,处于用户与物理数据库之间,实现对数据库的操作。数据库与实例关系:数据库实例是数据库系统的软件结构,由内存结构与后台进程组成,处于用户与物理数据库之间,实现对数据库的操作。通常,数据库与实例是一一对应的,在并行数据库服务器结构中,一个数据库对应多个实例。
    12.后台进程的作用:在内存与磁盘之间进行I/O操作;监视各个服务器的金策划那个状态;协调各个服务器的任务,维护系统性能和可靠性。后台进程包括数据库写进程(DBWR)、日志写进程(LGWR)、检查点进程(CKPT)、系统监控进程(SMON)等。DBWR进程负责把数据高速缓冲区中已经被修改过的数据(“脏”缓存块)成批写入数据文件中永久保存,同时使数据高速缓冲区有更多的空闲缓存块,保证服务器进程将所需要的数据从数据文件读取到数据高速缓冲区中,提高缓存命中率。LGWR日志写入进程负责把重做日志缓冲区的重做记录写入重做日志文件中永久保存。
    13. 数据库启动的3种模式:①startup nomount :对应数据库启动的第一个步骤。用于创建一个新的数据库或重建数据库的控制文件。②startup mount :对应数据库启动的第二个步骤。用于重命名数据文件、添加、删除或重命名重做日志文件、改变数据库的归档模式、执行数据库完全恢复操作等。③startup open :对应数据库启动的第三个步骤。正常方式打开数据库,具有create session 权限的用户都可以连接到数据库并访问。
    14.数据库模式:数据库模式与用户之间的区别在于:用户是数据库的使用者和管理者,用户具有帐户状态、访问权限和操作权限等属性。模式是一系列逻辑数据结构或对象的集合,是数据库中对象的组织和管理单位。
    15. 表的约束包括:1.主键约束:定义了主键约束的列取值不能为空,也不能重复。起唯一标识作用,一个表只能定义一个。2.唯一性约束:定义了唯一性约束的列取值必须唯一,可以为空值。3.检查约束:定义了检查约束的列取值要满足检查条件。一个列可以定义多个检查约束,约束表达式中不能包含子查询和伪列。4.外键约束:定义了外键约束的列取值要么是主表参照列的值,要么是空值。5.空/非空约束:定义了非空约束的列取值不能为空。同一个表可以定义多个非空约束,只能是列级约束。
    16. 数据库的分区概念:所谓分区是指将一个巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个小的、可以独立管理的部分,称为原来表或索引的分区。对巨型表进行分区后,即可以对整个表进行操作,也可以针对特定的分区进行操作,从而简化了对表的管理和维护

  • 相关阅读:
    部署nginx服务
    mysql主从配置
    LNMP+WordPress博客搭建
    CIFS(Samba)服务的使用
    NFS服务的使用
    LVM逻辑卷
    FTP学习
    文件处理+生成器
    内置函数
    Python3
  • 原文地址:https://www.cnblogs.com/tufujie/p/5071253.html
Copyright © 2020-2023  润新知