打开cmd
sqlplus
如果暂时不登录
sqlplus /nolog
完整连接方式:
conn username/password@连接字符串 as 身份
例:(连接远程服务器)
IP,端口,服务名,用户名和密码
conn system/[email protected]:1521/orcl
查找数据文件:
select name from v$datafile;
查找控制文件:
select name from v$controlfile;
查找日志文件:
select group# from v$logfile;
表空间(查询表结构):
`desc v$tablespace`
数据库的名字
desc v$database
查找数据库的名字
select name from v$database;
查找数据库有多少表空间:
select name from v$tablespace;
如果需要保留写过的命令
spool d:/oracle724.txt
写完之后
spool off
查看用户
desc dba_users
select username from dba_users
新建表空间
create tablespace shoppingtp datafile 'D:/shoppingtp01.dbf'size 10M autoextend on next 10M maxsize 1G;
修改表空间(新增)
alter tablespace shoppingtp add datafile 'D:/shoppingtp02.dbf' size 10M autoextend on next 10M maxsize 1G;
查看文件
desc dba_data_files
查询信息(查询一定要用大写,因为写进去就改成大写)
select file_name,tablespace_name,bytes,blocks from dba_data_files where tablespace_name='SHOPPINGTP'
删除表空间
drop tablespace DEMOSPACE including contents and datafiles
系统数据字典 DBA_TABLESPACES 中记录了关于表空间的详细信息:
select * from sys.dba_tablespaces;
新增用户
create user test_user identified by abc default tablespace tptest;
删除用户
drop user zyt cascade
更改用户密码(高权限下)
alter user zyt(用户名) identitfied by abc123(密码)
修改当前用户密码
password
解锁下一级用户
alter user 用户名 account lock/unlock;
【edit】->【/】编辑命令,执行缓存命令
授予权限:
创建回话权限(即可以登录)
grant create session to test_user
赋予建表权限,但是没有插入数据权限
grant create table to test_user
【Connect】-登陆执行基本函数【Resource】-建立用户自己的数据对象 【DBA】-总经理
grant connect,resource to test_user
收回权限
revoke 权限 from 用户
对象权限(不同于对象权限),9种对象权限
grant select on t4 to test_user;
给另一个用户赋予对象权限
conn test_user/abc
登陆另一个用户
select * from test_user2.t4
需要带上表的拥有者才能使用对象权限
with grant option
对象权限传递
【概要文件:赋予用户来限制用户的操作】
查看限制
show parameter resource_limit;
设置限制
alter system set resource_limit=TRUE;
新建文件编辑概要文件
create profile pro_test limit
概要文件内容(举例)
sessions_per_user 3 //限制会话数3,即开启多个cmd登陆
connect_time 3 //连接时间3分钟
failed_login_attempts 2 //密码输错2次以上账户即锁
;
设置对应用户
alter user test_user default tablespace tptest
profile pro_test
;
查看用户和对应概要文件
select username,profile from dba_users;
create table shopping_user.t_user3(
2 uiid char(6) primary key,--用户ID
3 uname varchar2(20) not null
4 )
5 TABLESPACE USERS;
查看T_USER表的所有者,表空间
select owner,table_name,tablespace_name from all_tables where table_name='T_USER'
【解决数据文件丢失的方法:】
登录sys用户
conn /as sysdba
shutdown immediate
提示"数据库未打开",说明第三步不成功(数据库启动和关闭——三步nomount->mount->open)
startup mount
装载完毕->第二步mount,装载控制文件
alter database open;
问题暴露出来:没有数据文件
有备份,还原即可
没有备份,数据文件确实丢掉了,则删除丢掉文件的物理信息,弃车保帅
alter database datafile 'd:/tptest01.dbf' offline drop
alter database open
显示"数据库已更改"
测试数据库最好的状态就是建表
create table t4(f1 char(8));
【pctfree默认是10,主要看更新的数据有多大,可以查看表的max_row_len如果很大又频繁更新可以考虑增加该值。
pctused主要看删除数据的大小,如果很大可以调大该值,如果不是很频繁可以设置小一些30-40
pctused+pctfree<90】
—pctfree:考虑update,比如用户信息表,地址update频率比较高,地址varchar(50)占用用户总信息(110)约50%,假设一半用户刚开始都不设地址,后期update地址,那么pctfree大概为50%*50%=25%,所以考虑设置25
—pctused:考虑delete,如用户信息表一般不做删除,则无需设置pctused,(oracle默认值40,一般都是合适的);如商品信息表,删除操作比较频繁则有必要调整pctused。
假设数据块为200M,此时pctused需要设置高一点,比如60%,则低于120M时可插入数据,此时空余空间80M,(如果设置20%,则需要空余160M空间才能插入,浪费空间);
假设数据块为2M,此时pctused需要设置低一点,比如20%,则低于0.4M时可插入数据,此时空余空间1.2M,(如果设置60%,则空余0.8M空间就能插入,插入数据少,效率低);
-----一条用户信息是连续存储的,会有空余空间给予修改,当修改量超过pctfree时,需要进行行迁移,迁移到另一个数据块,同时指针指向该条数据;数据库大小是NEXT值
分区表:选择分区之后,不会扫描别的区间数据,搜索速度就会很快(经典数据分区案例:淘宝筛选区)
范围分区:range,价格分区,日起分区,金额分区;(PPT例子)
散列分区:list,可以进行枚举的,评价(好中差评),发货地分区(广州深圳浙江。。。),
【alter table t1 drop colum f5;】删除列
【alter table t1 modify f2 varchar2(10);】修改列
【alter table employees
add job_count number(2) check(job_count>=0);】新增列
修改列和修改表名字会使列和表的意义改变,建议重建
【drop table t1;】删除表,不可逆
【delete from t1】delete操作在少量数据速度可行,可撤销数据;但是大量数据时候速度慢,且无法马上清空空间
【rollback;】
【truncate table t1】表被截断,速度快,清空空间
delete:删除数据,可以撤销,可以带条件;效率低,不会及时释放空间
truncate:清除所有数据,保留表结构,效率高,释放空间,不可撤销
drop:删除表和数据结构,不可撤销
【create table emp as select * from employees 】另存一个表,相当于备份
【create table emp as select * from employees where 1=2;】只要结构,不要数据
第一种插入写法:
insert into emp
values(23,'yq','lee','[email protected]','18819259360',to_date('2017-7-26','yyyy-mm-dd'),'FI_MGR',2000,0.1,null,60);
日期型数据,如果不做变化需要和oracle相同模式;加上to_date可以强制转换,参照老师给的资料《函数大全》
第二种插入写法:指定列添加数据,其他列为空
insert into emp(employee_id,last_name,email,hire_date,job_id)
values(5,'mary','mary@qq,com',sysdate,'hjh')
;
批量添加:
【desc emp】【desc employees】表结构一样
第一种:
【insert into emp select * from employees where department_id=60;】
【insert into emp select * from employees】
第二种:
【insert into emp
select employee_id,null,last_name,email,null,hire_date,‘job’,salary ,0.1,null,null from employees;
】
第三种:
【insert into emp (employee_id,last_name,email,null,hire_date,salary,job_id)
select employees_id,last_name,email,null,hire_date,salary,job_id from employees;】
括号里是emp表列名,对应employees表的列顺序