数据库死锁分析

关于数据库死锁的文章,可以看看:
https://www.cnblogs.com/kerrycode/p/6928263.html
http://www.cnblogs.com/lhrbest/p/6005702.html

数据库优化创建索引小结

为了方便读者阅读,下面对相关索引知识做个小结。
1) 主键由系统自动创建,不需要另外建;
2) 外键需要创建索引;
3) 常用的列作为索引列,而且要将最常用的列放在最前面,常用的列一般通过连接条件和筛选条件可确定;
4) 数据可选性低的列一般不作为索引列;
5) 如果查询中经常同时使用某几列,那么给这些列创建一个复合索引;
6) 对于复合索引,查询语句中必须包含复合索引的前导列,否则无法命中索引;
7) 给一个表创建太多索引会影响增、删、改速度,但有时候由于检索的性能要求高也必须创建,因此创建索引时需要考虑相关的利弊平衡;
8) 频繁对一个表进行增、删、改操作会产生很多数据库碎片,因此需要定期重建索引;
9) 短时间内频繁增、删、改会导致统计信息不准确,从而导致数据库无法根据统计信息采取合适的优化策略,无法选择合适的索引。

更新数据库统计信息

创建完索引后查看执行计划,发现并没有使用索引,究其原因是没有更新统计信息。
根据网上查到的资料显示,Oracle10g及以后的版本,采用的CBO优化器,它的特点是基于数据库对表和索引的统计信息(包括表的大小、行数、每行长度等)来计算耗费,然后选在耗费最低的执行计划。因此如果数据库收集的统计信息是错误的,那么将造成错误的执行计划。
更新统计信息的sql(统计表、索引、直方图):
———dbms方式——————

也可以用analyze 方式,但是据我所查的资料说oracle 10以后推荐用dbms的方式。
————analyze方式——————

从一个表复制、迁移和过滤数据sql

1、insert into table2 select * from table1
说明:
table2必须已经在数据库中创建;
table1、table2换成自己的表名。
2、select * into table2 from table1
说明:
table2在数据库中没有创建,由语句自己创建。
限制:oracle不支持此种写法。
3、create table table2 as select * from table2
说明:
table2在数据库中不存在,有语句执行创建。
此语句在oracle中支持,在其他数据库中是否支持请读者自行测试。
这条语句与前面2中select * into table2 from table2所述效果一样

查询已创建的索引和索引列

样例如下:

ava.sql.SQLException: OAUTH marshaling failure

描述:
用java写的小工具连接Oracle 11g数据库时,提示如下错误:
ava.sql.SQLException: OAUTH marshaling failure
实验过程:
1、修改JRE
网上不少介绍都说是JRE问题,于是确认一下。
1)确认本机JRE版本
2)Oracle 11g的JRE应该是1.5
相关文章:
http://docs.alfresco.com/4.1/tasks/oracledb-config.html
https://java.net/jira/browse/GLASSFISH-15004
2、JDBC驱动有问题
有些网上介绍说是驱动问题,比如:
https://www.eclipse.org/forums/index.php/t/430801/
http://blog.itpub.net/35489/viewspace-1221131/
最终方案:

如何高水位线下无数据却需要全表扫描

/**统计高水位线下无数据,且需要全表扫描的**/
select table_name,
(Blocks * 8192/1024/1024) – (num_rows*avg_row_len/1024/1024) as “data lower than hwm in MB”
from user_tables where table_name=upper(‘sm_log_operatelog_t01’);
/***统计 用户 BGY65_JY1223 表 sm_log_operatelog_t01**/
exec dbms_stats.gather_table_stats(‘BGY65_JY1223′,’SM_LOG_OPERATELOG_T01’,CASCADE=>TRUE);
/***获取empty_blocks信息.**/
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =upper(‘sm_log_operatelog_t01’);
/**由于前面 无法获取 empty_blocks. 需要先分析**/
analyze table t1 compute statistics;
/***分析后重新查询一下.**/
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =upper(‘sm_log_operatelog_t01′);
/**对表进行碎片整理.**/
alter table sm_log_operatelog_t01 enable row movement;
alter table sm_log_operatelog_t01 shrink space cascade;
/**查询数据块.**/
select sum(bytes)/1024/1024 from dba_segments where segment_name=’sm_log_operatelog_t01′;
select sum(bytes)/1024/1024 from dba_segments where segment_name=’IDX_T1_ID’ ;
/**再看一下**/
/**统计高水位线下无数据,且需要全表扫描的**/
select table_name,(Blocks * 8192/1024/1024) – (num_rows*avg_row_len/1024/1024) as “data lower than hwm in MB”
from user_tables where table_name=upper(‘sm_log_operatelog_t01’);
/***统计 用户 BGY65_JY1223 表 sm_log_operatelog_t01**/
exec dbms_stats.gather_table_stats(‘BGY65_JY1223′,’SM_LOG_OPERATELOG_T01’,CASCADE=>TRUE);

删除大量数据操作后,查询性能效率没提高。

问题:为什么将一个数据表的数据进行大量后(即执行delete),对于该表的查询效率并没有提高呢?
答:对一个表执行大量delete操作后,数据库不会自动回收空间高水位线没有下降,因此对于查询,甚至后续的delete、insert操作无法提高性能。
解决方案:
方案一:shrink space
方案二:Move+rebuild index,即删除和重建索引。

相关sql参考:
查看剩余表空间
select * from dba_free_space where tablespace_name=’happy3w’;
查看某表所占空间:
select table_name,num_rows,blocks,empty_blocks,avg_row_len,last_analyzed from dba_tables where table_name like ‘TEST%’;
查看高水位状况
select header_file,header_block,bytes,blocks,extents from dba_segments where segment_name like ‘TEST%’;
extents:起始位置
header_file:高水位线位置

mysql root用户默认密码/重置密码

1、root用户默认没有密码,如果没设置过密码,Mysql不会提示你登录输入密码。
2、如何重置root密码
若root忘记密码,可按下面步骤执行重置。
1)创建重置密码的ini文件
文件内容:
MySQL 5.7.6 and later:
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘MyNewPass’;
MySQL 5.7.5 and earlier:
SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘MyNewPass’);
选择相应版本,保存为ini文件,乐3保存为“D:\program\MySQL\MySQL Server 5.7\bin\reset_root_psw.ini”
2)执行重置命令
C:\> cd “C:\Program Files\MySQL\MySQL Server 5.7\bin”
C:\> mysqld –init-file=C:\\mysql-init.txt
如果上面方式失败了,可以尝试这个:
UPDATE mysql.user
SET authentication_string = PASSWORD(‘MyNewPass’), password_expired = ‘N’
WHERE User = ‘root’ AND Host = ‘localhost’;
FLUSH PRIVILEGES;

MySQL Workbench 6.2下载

MySQL Workbench 6.3.6是mysql server服务和客户端UI界面集成的,与Mysql server install相比有界面,更方便一些。
必备安装:
•Microsoft .NET Framework 4 Client Profile
•Microsoft Visual C++ 2013 Redistributable Package (x86 or x64)
以上软件官网都有下载,但是国外网站一般比较慢。为了方便大家,下面是happy3w从官网下载分享给大家的。
happy3w分享下载:
mysql-workbench-community-6.3.6-winx64.msi
链接:http://pan.baidu.com/s/1nuCdikx 密码:undt
链接:http://pan.baidu.com/s/1nuRCmMH 密码:j0zn
链接:http://pan.baidu.com/s/1boPoIoJ 密码:0xgi