精华内容
下载资源
问答
  • oracle数据库写入数据的过程

    千次阅读 2017-10-22 23:22:41
    oracle数据库写入数据的过程

    各种后台进程的作用:

    Ckpt、lgwr、dbwn之间的协作。

    Ckpt:每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。

    LGWR:每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。

    DBWN:将SGA中脏块写入datafile。

     Oracle 写入数据过程:

    Oracle 写数据过程:dml操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。然后LGWR进程根据上述规则,将redo buffer中的信息写入到物理文件。此过程比较快(redo log为连续写)。完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。期间ckpt进程根据3秒的原则,作检查点,记录哪些脏 数据库写到了data file中(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了。)。将需要的信息记录在控制文件中。若实例崩溃或需要 错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。此时根据事务是否提交了,未提交的事务,根据 undo表空间的数据进行恢复(常说的undo,后滚操作)

     另一位网友的介绍:

    1、事务开始;

    2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;

    3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

    4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

    5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。

     

    附:checkpoint 由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data file里并释放站用的空间,由dbw后台进程完成,并修改controlfile和datafile的scn.
    一般手工执行(alter system checkpoint)是由于要删除某个日志但是该日志里还有没有同步到data file里的内容,就需要手工check point来同步数据,然后就可以drop logfile group n.

    展开全文
  • 2、修改批量入库方案:从监控IO来看,IO的写入速度确实有提高,但是同时写入多个表过程是单线程批量写入单个表,后来修改为并行写入多个表。但是依然存在内存居高不下的情况,这样的一个enb往往会...

    目前先后做了以下调整:

    1、单表多个线程写入的时候,总会因为写入log或单文件写入速度的限制,导致IO提到不了成为入库的瓶颈;为了提到入库IO速度,我们采取分表策略,一次性拆分到一个ENB为单元的物理表;

    2、修改批量入库方案:从监控IO来看,IO的写入速度确实有提高,但是同时写入多个表过程是单线程批量写入单个表,后来修改为并行写入多个表。但是依然存在内存居高不下的情况,这样的一个enb往往会造成内存居高不下,以至于内存资源成为瓶颈;

    3、为了解决内存成为瓶颈,在内存处理时,每当表记录到达50w,就批量入库一次,以便用来清理内存信息;

    4、基于以上方案,如果集中遇到大文件时,依然会出现内存不足,一个enb读取解析,入库都占用时长过长,而有小文件时,就不会出现占用时间过长的问题,所以针对任务采取控制同时运行的任务大文件不超过两个;

    5、之前一次读取enb的下的所有文件,拆分为一次性只读取一个文件,就解析入库,缩短每个线程占用时长,避免因为单个线程占用时长过长进而对cpu调度造成压力,避免线程给后置的情况发生;而且改为小文件为一个单独线程来处理后,每个线程占用的内存会降低,会增加同时入库同一个物理表的线程数增加,进而有可能提到IO利用率,进而提高入库性能。

        拆分为一个文件已入库,就会涉及到并行入库同一个或多个物理表的情况,而此时表结构是主子表结构,主表与字表之间通过一个oid来关联,必须要维护这个oid,以保证主表与字表之间的关联关系,如果并行插入单个表就常常会出现同一个oid已被占用的异常情况,我们采用一个GlobalMaxOID,来占坑每个物理表已经被占用的OID。

        在处理OID占坑策略时遇到了一下问题:

    并行处理一个ENB内部文件\\17x.xx.x.xx\xx\FTP2\xx\20160513\xx\Txxx.xml.gz时抛出异常
    事务(进程 ID 69)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

    后来发现从数据方面来解决希望不大,从程序的角度做了一下调整:

     1 /****** Object:  StoredProcedure [dbo].[GetGlobalMaxOID]    Script Date: 07/13/2016 23:50:04 ******/
     2 DROP PROCEDURE [dbo].[GetGlobalMaxOID]
     3 GO
     4 /****** Object:  Table [dbo].[GlobalMaxOID]    Script Date: 07/13/2016 23:50:03 ******/
     5 DROP TABLE [dbo].[GlobalMaxOID]
     6 GO
     7 /****** Object:  Table [dbo].[GlobalMaxOID]    Script Date: 07/13/2016 23:50:03 ******/
     8 SET ANSI_NULLS ON
     9 GO
    10 SET QUOTED_IDENTIFIER ON
    11 GO
    12 CREATE TABLE [dbo].[GlobalMaxOID](
    13     [ENodeBID] [int] NOT NULL,
    14     [TableName] [nvarchar](64) NOT NULL,
    15     [MaxOID] [bigint] NOT NULL,
    16     [Flag] [int] NOT NULL
    17 ) ON [PRIMARY]
    18 GO
    19 /****** Object:  StoredProcedure [dbo].[GetGlobalMaxOID]    Script Date: 07/13/2016 23:50:04 ******/
    20 SET ANSI_NULLS ON
    21 GO
    22 SET QUOTED_IDENTIFIER ON
    23 GO
    24 -- =============================================
    25 -- Author:        tommy duan
    26 -- Create date: 2016-07-12
    27 -- Description: OID 占坑
    28 -- =============================================
    29 CREATE PROCEDURE [dbo].[GetGlobalMaxOID]
    30     @ENodeBID int,
    31     @TableName nvarchar(64),
    32     @TempCount int
    33 AS
    34 BEGIN
    35     SET NOCOUNT ON;
    36     
    37     Declare @MaxOID bigint;
    38     
    39     Set XACT_ABORT ON;
    40     Begin Transaction    
    41         if not exists(Select ENodeBID From dbo.GlobalMaxOID Where ENodeBID=@ENodeBID and TableName=@TableName) begin
    42             insert into dbo.GlobalMaxOID(ENodeBID,TableName,MaxOID,Flag)VALUES(@ENodeBID,@TableName,0,0);
    43         end
    44         
    45         Update dbo.GlobalMaxOID Set Flag=1 Where ENodeBID=@ENodeBID and TableName=@TableName;
    46     
    47         Select @MaxOID=MaxOID From dbo.GlobalMaxOID Where ENodeBID=@ENodeBID and TableName=@TableName;
    48                     
    49         Update dbo.GlobalMaxOID Set MaxOID=(@MaxOID+@TempCount),Flag=0 Where ENodeBID=@ENodeBID and TableName=@TableName;
    50     Commit Transaction;    
    51     
    52     Select @MaxOID;    
    53 END
    54 GO

    使用lock:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Data.SqlClient;
     6 using System.Threading.Tasks;
     7 using System.Configuration;
     8 
     9 namespace TestGlobalMaxOID
    10 {
    11     class Task
    12     {
    13         public int ENodeBID { get; set; }
    14         public int TempCount { get; set; }
    15         public string ConnectionString { get; set; }
    16     }
    17 
    18     class Program
    19     {
    20         static object locker = new object();
    21 
    22         static void Main(string[] args)
    23         {
    24             string tableName = string.Empty;
    25 
    26             Parallel.For(10000, 10100, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (int enodebid) =>
    27             {
    28                 List<Task> tasks = new List<Task>();
    29                 for (int i = 0; i < 100; i++)
    30                 {
    31                     tasks.Add(new Task() { ENodeBID = enodebid, TempCount = 1000000, ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString });
    32                 }
    33 
    34                 Parallel.ForEach(tasks, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (Task task) =>
    35                 {
    36                     Console.WriteLine(GetMaxOIDByTableNameAndENodeBID(task.ConnectionString, "MRO", task.ENodeBID, task.TempCount));
    37                 });
    38             });
    39 
    40 
    41             Console.WriteLine("Complete!");
    42             Console.ReadKey();
    43 
    44         }
    45 
    46         static long GetMaxOIDByTableNameAndENodeBID(string connectionString, string tableName, int eNodeBId, int tempCount)
    47         {
    48             lock (locker)
    49             {
    50                 using (SqlConnection connection = new SqlConnection(connectionString))
    51                 {
    52                     using (SqlCommand command = new SqlCommand())
    53                     {
    54                         connection.Open();
    55 
    56                         command.Connection = connection;
    57                         command.CommandText = "[dbo].[GetGlobalMaxOID]";
    58                         command.CommandType = System.Data.CommandType.StoredProcedure;
    59 
    60                         command.Parameters.Add(new SqlParameter("@ENodeBID", eNodeBId));
    61                         command.Parameters.Add(new SqlParameter("@TableName", tableName));
    62                         command.Parameters.Add(new SqlParameter("@TempCount", tempCount));
    63 
    64                         object obj = command.ExecuteScalar();
    65 
    66                         return Convert.ToInt64(obj);
    67                     }
    68                 }
    69             }
    70         }
    71 
    72     }
    73 }

     

    展开全文
  • 客户提到数据库分片、表复制能提高数据库性能,但可惜对这些技术好像不知道,只知道表分区,不知道分片,知道表批量复制,可以被订阅推送等,及主从复制,不知道这里说的表复制到时所谓什么技术。 客户提到MongoDB,...
    • 客户给出建议方案:
    1. 一直听客户这边说mycat这个东东,一头雾水,这是什么东东,只听说过mysql不知道mycat,瞬间被鄙视N次方次。
    2. 客户提到数据库分片、表复制能提高数据库性能,但可惜对这些技术好像不知道,只知道表分区,不知道分片,知道表批量复制,可以被订阅推送等,及主从复制,不知道这里说的表复制到时所谓什么技术。
    3. 客户提到MongoDB,PostgreSQL比较强悍,基本上可以实现集群型结构,表分片相关复制相关技术,但到底在实际应用中怎么是个怎么运行的。

    sql优化书籍:https://www.simple-talk.com/books/sql-books/troubleshooting-sql-server-a-guide-for-the-accidental-dba/

    带着上边的问题,我认真的查阅了网上对这些技术的一些评价:

    • mycat是国人的,是一个数据库分库分表中间件。

    背景:

      基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。

    特性:

    1. 一个彻底开源的,面向企业应用开发的大数据库集群
    2. 支持事务、ACID、可以替代MySQL的加强版数据库
    3. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
    4. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
    5. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
    6. 一个新颖的数据库中间件产品

    官网:http://www.mycat.org.cn/

    代码:http://git.oschina.net/linzhiqiang/Mycat-Server,https://github.com/MyCATApache/Mycat-Server,https://github.com/MyCATApache/Mycat-download

    相关参阅文章:

    开源分布式数据库中间件MYCAT:http://blog.oldboyedu.com/mysql-mycat/
    MyCat:开源分布式数据库中间件:http://www.csdn.net/article/2015-07-16/2825228

    • MongoDB

    几年前就对它有耳闻,只是知道是一个nosql数据库,知道存储格式json化,是一个文件数据库。

    MongoDB支持分片:

    具体实现:http://my.oschina.net/ydsakyclguozi/blog/268377

    • PostgreSQL

    这个东西了解的少,这几天一直听客户说这是一个有点类似mycat的数据库中间件,它有很多plugin,附件上之后支持nosql,列存储,crystal db,集群(分片)等。

    • 如何实现数据库分布式,分库,分表:

    具体参阅文章:

    服务端高性能数据库优化演变细节案例:http://blog.oldboyedu.com/high-performance-database/
    基于mysql(innodb)优化:http://blog.oldboyedu.com/mysql-optimization/
    Mysql 基于 Amoeba 的 水平和垂直 分片:http://pengranxiang.iteye.com/blog/1145342
    Amoeba使用指南:http://docs.hexnova.com/amoeba/
    PostgreSQL sharding 数据分片 for Oracle, SQL Server, DB2, Sybase :http://blog.163.com/digoal@126/blog/static/163877040201612313414725/

     

     

    展开全文
  • Mysql数据库写入数据速度优化1)innodb_flush_log_at_trx_commit 默认值为1;设置为0,可以提高写入速度。值为0:提升写入速度,但是安全方面较差,mysql服务器宕机可能会造成数据丢失。值为1:每一次事务提交或者...

    Mysql数据库写入数据速度优化

    1)innodb_flush_log_at_trx_commit 默认值为1;设置为0,可以提高写入速度。

    值为0:提升写入速度,但是安全方面较差,mysql服务器宕机可能会造成数据丢失。

    值为1:每一次事务提交或者事务外的指令都需要把日志写入硬盘,此过程消耗时间较长;

    值为2:是每次操作不写入硬盘,而是写入系统缓存,日志仍然会每秒刷新硬盘;

    2)innodb_autoextend_increment默认值为8M,调整为128M ;

    此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。

    3)innodb_log_buffer_size默认值为1M,调整为16M ;

    此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。

    4)innodb_log_file_size默认值为 8M,调整为128M ;

    此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。

    5)bulk_insert_buffer_size默认值为8M,调整为100M;

    作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。

    innodb_flush_log_at_trx_commit、innodb_log_buffer_size和

    innodb_log_file_size 需要谨慎调整;因为涉及MySQL本身的容灾处理。

    展开全文
  • Scrapy高并发数据库写入

    千次阅读 2019-05-02 21:56:53
    爬虫过程中不可缺少的环节就是数据存储,一般来说这些数据首选是保存到数据库中。但是数据库写的方式是同步写入,能不能像 request 请求那样遇到这种 I/O 操作就去执行其他任务呢?答案是可以的。 Scrapy异步写入 ...
  • 由于项目变态需求;需要在一个比较短时间段急剧增加数据库记录(两三天内,由于0增加...提高数据库插入性能中心思想:1、尽量使数据库一次性写入Data File2、减少数据库的checkpoint 操作3、程序上尽量缓冲数据,进行...
  • Mysql数据库写入数据速度优化1)innodb_flush_log_at_trx_commit 默认值为1;设置为0,可以提高写入速度。值为0:提升写入速度,但是安全方面较差,mysql服务器宕机可能会造成数据丢失。值为1:每一次事务提交或者...
  • Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1;设置为0,可以提高写入速度。 值为0:提升写入速度,但是安全方面较差,mysql服务器宕机可能会造成数据丢失。 值为1:每一次事务提交...
  • 数据库写入性能一直是设计和开发人员关注的焦点,高性能的更新是数据库支持OLTP类应用的基础。本文使用stackoverflow的公开数据,以及APOC中的iterate过程,仅使用基本的工具、在普通的硬件上,通过对测试结果的估算...
  • 本文通过InjectJob来追踪webpage的定义、创建、传递、序列化、写入数据库的整个过程。从源码中摘录了重要的代码行,并标明其所在文件名、行号。 1. 定义 schema schema直接写在源代码里面: [cpp] view plain ...
  • Python操作数据库写入CSV文件

    千次阅读 2018-09-11 18:03:40
    在做APP自动化测试数据进行分离的时候,需要将数据库的瓶码数据获取到,然后再传入接口,我在网上边学边做花了两天的时间终于,弄成了理想的样子。在这里记录自己的学习过程。 二、环境 Python3.6 MySQL-...
  • 这几天做毕设,写了个微信小程序的javaweb后台,发现自己相当的糊涂,向数据库写入数据,运行了n次,调试也没有错误,打印也能获取到,可就是插入不进数据库,百度了一番,都没有解决自己问题,最后发现!...
  • Java连接Mysql数据库写入中文数据乱码成???的解决方法问题介绍Java连接JDBC问题解决方法 问题介绍 在本地创建好表,写入中文数据时,发现调用接口写入的数据值变成了???,但是手动输入的时候是可以显示中文的...
  • 解决:原因是在写存储过程时,没有将字段的长度设置好,是采用默认的,所以才导致数据库在执行存储过程时,把字符串自动截取为存储过程中声明的字段长度,这才导致数据不完整。在写sql的时候特别要注...
  • 我们在做项目过程中,经常要从Myeclipse/Eclipse向数据库写入数据,小伙伴们也经常遇到这种情况,就是数据中带有中文的话,存到数据库中就变成了“???”这就是中文乱码,解决办法 1、项目编码格式改为UTF-...
  • 在我们平时的开发过程中,经常要向数据库插入数据,有时可能要进行很多次类似的操作,比如向数据库中的同一个表同时插入若干数据,即批量插入数据。向数据库中批量插入数据,可以将若干条数据一次插入道数据库,提高...
  • 1、数据库链接驱动如果没有安装对应的数据库驱动,在数据库连接的过程中,可能会报某个数据库连接找不到的异常,因此需要下载对应驱动后(安装步骤可以参见“怎么在官网上下载java连接mysql的驱动jar包?”),放入...
  • USE [Appserver] GO /****** Object: StoredProcedure [AppServer].[ImportNodeRelationData] Script Date: 08/05/2013 19:15:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [...
  • 3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中; 4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中; 5、当发生checkpoint,CKPT进程更新所有数据文件.....
  • 这个时候会直接读取Redis数据库中的数据进行操作,会把Redis数据库中存在的键值对写入到AOF重写文件中,这个时候常常会出现如下情况:用户在这个AOF重写过程中对数据库进行了写入或者修改的操作。 Redis的解决方法...
  • //变量声明,数据库中的字段,对应c++中的类型 _int64 id; // bigint Unchecked int bvehicleid; // int Checked wchar_t* number; // nvarchar(MAX) Checked int cstreamid; // int Checked _int64 ...
  • 它由两个存储过程组成。您可能会满意只运行第一个。第二个使用第一个的输出(表中第一个左的数据)。您可能还希望将代码合并为一个。但是我将它们分开。第二个存储的proc产生类似于的输出describe myTable。但是它将对...
  • 在上面的配置文件中,content,s_id,t_id是我自定义的三个字段,如何让这三个字段也写入数据库呢,我们一步一步来配置。 首先,需要将三个自定义字段放到一个entity类中: namespace FuNong.Framework.Logger { ...
  • 问题1: 在公司进行log4net写入服务器配置的时候,一切正常,但是在家里的机器上,就频繁出现这个问题: SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误 并且这种错误是随机性的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,417
精华内容 1,366
关键字:

数据库写入过程