精华内容
下载资源
问答
  • 执行的方法(依赖ant.jar): static String fileName = "D:\\workspace\\huzhou\\jd-txt73015\\sql\\f_xxyr_xlcjdj.sql"; public static void runSqlFile(){ SQLExec sqlExec = new SQLExec(); sqlExec.setDriver...

    标签:

    定义数据库连接属性:

    static String diverName="oracle.jdbc.driver.OracleDriver";

    static String url = "jdbc:oracle:thin:@192.168.90.11:1521:ucap";

    static String user="armyoa73015";

    static String pwd = "armyoa73015";

    1. 执行的方法(依赖ant.jar):

    static String fileName = "D:\\workspace\\huzhou\\jd-txt73015\\sql\\f_xxyr_xlcjdj.sql";

    public static void runSqlFile(){

    SQLExec sqlExec = new SQLExec();

    sqlExec.setDriver(diverName);

    sqlExec.setUrl(url);

    sqlExec.setUserid(user);

    sqlExec.setPassword(pwd);

    sqlExec.setSrc(new File(fileName));

    sqlExec.setEncoding("GBK");

    DelimiterType dt = new DelimiterType();

    dt.setValue("row");

    sqlExec.setDelimiterType(dt);

    sqlExec.setDelimiter("/");

    sqlExec.setKeepformat(true);

    sqlExec.setProject(new Project());

    sqlExec.execute();

    }

    2. 执行的方法(依赖mybatis-3.0.6.jar):

    public static void runSqlFile1(){

    try {

    Class.forName(diverName);

    Connection conn = DriverManager.getConnection(url, user, pwd);

    ScriptRunner runner = new ScriptRunner(conn);

    runner.setAutoCommit(true);

    File file = new File(fileName);

    try {

    if (file.getName().endsWith(".sql")) {

    runner.setFullLineDelimiter(true);

    runner.setDelimiter("##");

    runner.setSendFullScript(false);

    runner.setAutoCommit(true);

    runner.setStopOnError(true);

    runner.runScript(new InputStreamReader(new FileInputStream(fileName),"GBK"));

    }

    }catch(Exception e){

    e.printStackTrace();

    }

    conn.close();

    } catch (SQLException e) {

    e.printStackTrace();

    } catch (ClassNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    注:此方法执行后,存储过程、触发器、函数、包会处于无效状态。原因未知???

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    标签:

    展开全文
  • //从文件读放内容到按分号放到sqlFileListpublic List readSqlFiles(List fileNameList) {List sqlList = new ArrayList();for (String fileName : fileNameList) {File myFile = new File(f...

    List

    sqlFileList = new ArrayList

    ();

    //从文件读放内容到按分号放到sqlFileList

    public List

    readSqlFiles(List

    fileNameList) {

    List sqlList = new ArrayList

    ();

    for (String fileName : fileNameList) {

    File myFile = new File(fileName);

    if (!myFile.exists()) {

    System.err.println("Can't Find " + fileName);

    continue;

    }

    StringBuffer temp = new StringBuffer();

    try {

    BufferedReader in = new BufferedReader(new

    FileReader(myFile));

    String str;

    while ((str = in.readLine()) != null) {

    temp.append(str);

    }

    in.close();

    } catch (IOException e) {

    e.getStackTrace();

    }

    String sqls[] = temp.toString().split(";");

    for (String sql : sqls) {

    sqlList.add(sql);

    }

    }

    return sqlList;

    }

    //然后一句句的执行

    for (String sql : sqlList) {

    pstmt = con.prepareStatement(sql,

    ResultSet.TYPE_SCROLL_INSENSITIVE,

    ResultSet.CONCUR_READ_ONLY);

    pstmt.execute();

    }

    展开全文
  • 开发环境和测试环境下经常同步数据,都是导出insert语句然后直接粘贴到plsql中执行,但是有时候几千条上万条的话,执行的就超慢,可能要一个多钟头了,这时候就需要使用文件方式执行了, 先把所有的sql语句保存到一...

    1.导入
    开发环境和测试环境下经常同步数据,都是导出insert语句然后直接粘贴到plsql中执行,但是有时候几千条上万条的话,执行的就超慢,可能要一个多钟头了,这时候就需要使用文件方式执行了,
    先把所有的sql语句保存到一个文件中,
    然后plsql选择 command window ,不是sql window ,
    然后输入命令 start D:\aa.sql (或者使用 @‘D:\aa.sql’,或者@D:\aa.sql) 回车,ok了,一般一万多条也就一分钟就执行完毕,执行完成之后记得点击左上角的提交commit按钮,不然数据并没有插入数据库。
    (从.sql脚本文件读取数据到数据库。
    1.新建Command Windows:
    2.执行:SQL> @C:\Users\CiWei\Desktop\TRN_VENDORS_4040.sql;)
    在这里插入图片描述

    在这里插入图片描述

    2.导出
    https://www.cnblogs.com/CiWEi-/archive/2011/12/09/2282358.html
    PL/SQL自带导出数据库中表到.sql脚本文件的工具。
    1.在objects窗口中,选中表》右击》Export Data
    2.选》SQL Inserts
    选择:Create tables,其他选项看情况选择。
    3.Output file:选择输出路径及文件名。
    Export即可。
    在这里插入图片描述
    4.输出的脚本文件中的部分代码:
    在这里插入图片描述

    展开全文
  • 上一篇文章咱们说了一条查询sql的执行过程。如果没有看过上一篇文章的可以去看下上一篇...借用上篇文章的图,如下:我这边就再简单的说一下这个流程,首先客户端连接mysql服务器,连接后执行sql语句,执行sql的过...

    上一篇文章咱们说了一条查询sql的执行过程。如果没有看过上一篇文章的可以去看下上一篇文章,今天咱们说说一条更新sql的执行过程。

    update scores set score=c+10 where id=1

    上面一条sql是将id为1的分数加上10。

    那么它的执行流程是怎样的呢?借用上篇文章的图,如下:

    11e2a14a55bdde8033d54496ec2267d8.png

    我这边就再简单的说一下这个流程,首先客户端连接mysql服务器,连接后执行sql语句,执行sql的过程需要经过分析器得出它是需要做update操作,再接着经过优化器它决定使用id这个索引,然后经过执行器通过索引找到这一行,最后进行更新操作。

    以上就是整个更新操作得整个流程。说到这你肯定以为说完了,不过很遗憾的告诉你,这才刚刚开始呢。

    因为更新操作和查询操作不一样,更新操作涉及到两个非常重要的日志模块。redo log (重做日志) 和 bin log(归档日志)。这个两个才是今天要说的重点。

    首先咱们得知道这两个日志是什么?然后再得知道它们是干什么的?

    1、redo log(重做日志)

    redo log 是 InnoDB 引擎特有,它是属于物理日志,主要用于记录 “某个数据页上做了什么修改” ,而且它的记录空间是固定的并且是会用完的。

    举一个小例子:

    不知道你看过《孔乙己》这篇文章,酒店掌柜有一个粉板,专门用来记录客人的赊账记录。如果赊账的人不多,那么他可以把顾客名和账目写在板上。但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。

    如果有人要赊账或者还账的话,掌柜一般有两种做法:

    • 一种做法是直接把账本翻出来,把这次赊的账加上去或者扣除掉;
    • 另一种做法是先在粉板上记下这次的账,等打烊以后再把账本翻出来核算。

    在生意红火柜台很忙时,掌柜一定会选择后者,因为前者操作实在是太麻烦了。首先,你得找到这个人的赊账总额那条记录。你想想,密密麻麻几十页,掌柜要找到那个名字,可能还得带上老花镜慢慢找,找到之后再拿出算盘计算,最后再将结果写回到账本上。这整个过程想想都麻烦。相比之下,还是先在粉板上记一下方便。你想想,如果掌柜没有粉板的帮助,每次记账都得翻账本,效率是不是低得让人难以忍受?

    同样,在 MySQL 里也有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。为了解决这个问题,MySQL 的设计者就用了类似酒店掌柜粉板的思路来提升更新效率。而粉板和账本配合的整个过程,其实就是 MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。

    具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,这就像打烊以后掌柜做的事。

    如果今天赊账的不多,掌柜可以等打烊后再整理。但如果某天赊账的特别多,粉板写满了,又怎么办呢?这个时候掌柜只好放下手中的活儿,把粉板中的一部分赊账记录更新到账本中,然后把这些记录从粉板上擦掉,为记新账腾出空间。

    与此类似,InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

    fee34fc6516c13ec67026ab7fb5913d5.png

    write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

    write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

    有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

    要理解 crash-safe 这个概念,可以想想我们前面赊账记录的例子。只要赊账记录记在了粉板上或写在了账本上,之后即使掌柜忘记了,比如突然停业几天,恢复生意后依然可以通过账本和粉板上的数据明确赊账账目。

    2、binlog(归档日志)

    前面我们讲过,MySQL 整体来看,其实就有两块:一块是 Server 层,它主要做的是 MySQL 功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。上面我们聊到的粉板 redo log 是 InnoDB 引擎特有的日志,而 Server 层也有自己的日志,称为 binlog(归档日志)。

    bin log 是属于 server 层持有的,主要是再执行器中记录日志,所以mysql所有的引擎都可以使用它。bin log 是属于逻辑日志,它有 statement 和 row 两种模式,statement记录的是执行的sql语句,row记录的是更新行的内容,所以是记录两条,一条是更新前的内容,另外一条是更新后的内容。默认模式是 row 模式。另外 bin log 是会追加写入日志,当日志文件写到一定大小的时候,就会切换到下一个继续写入日志,并且不会覆盖之前的日志文件。

    为什么会有两份日志呢?

    因为最开始 MySQL 里并没有 InnoDB引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。

    以上就是这两种日志的概念以及作用,那么现在我们说说它们的记录流程。咱们先看下面一张图,黄填充色的为执行器的操作,蓝填充色为InnoDB引擎的操作

    038a54f7a47aa21c685150f096531027.png

    图有点长,不过应该很容易看懂。那么现在就来一步一步的分析。

    1、首先执行器会找引擎取id=1这条数据;

    2、因为id是主键,所以使用树来找到一行数据。不过引擎先去内存中查找是否有这一页数据;

    3、如果有则直接返回数据给执行器;如果没有就会去磁盘把数据读入到内存中,然后返回数据给执行器。

    4、执行器就会执行C+10操作;

    5、执行器生成新的一行数据;

    6、再调用 InnoDB 引擎的写入接口,把数据更新到内存中;

    7、InnoDB 引擎写入 redo log 日志,标记状态为 prepare,并且告诉执行器已经更新数据完成,可以随时提交事务;

    8、执行器把此操作写入 bin log ,并且把 bin log 写入磁盘;

    9、最后执行器调用引擎的提交事务接口,引擎把 redo log 的状态改 commit ,至此整个更新操作完成。

    你可能注意到了,最后三步看上去有点“绕”,将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

    3、两阶段提交

    为什么必须有“两阶段提交”呢?这是为了让两份日志之间的逻辑一致。要说明这个问题,我们思考一个问题:怎样让数据库恢复到半个月内任意一秒的状态?

    前面我们说过了,binlog 会记录所有的逻辑操作,并且是采用“追加写”的形式。如果你的 DBA 承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有 binlog,同时系统会定期做整库备份。这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。

    当需要恢复到指定的某一秒时,比如某天下午两点发现中午十二点有一次误删表,需要找回数据,那你可以这么做:

    1. 首先,找到最近的一次全量备份,如果你运气好,可能就是昨天晚上的一个备份,从这个备份恢复到临时库;
    2. 然后,从备份的时间点开始,将备份的 binlog 依次取出来,重放到中午误删表之前的那个时刻。
    3. 这样你的临时库就跟误删之前的线上库一样了,然后你可以把表数据从临时库取出来,按需要恢复到线上库去。

    那为什么日志需要“两阶段提交”。

    由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。

    仍然用前面的 update 语句来做例子。假设当前 ID=2 的行,字段 c 的值是 0,再假设执行 update 语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?

    1. 先写 redo log 后写 binlog。
    2. 假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 1。
    3. 但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。
    4. 先写 binlog 后写 redo log。
    5. 如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 c 的值是 0。但是 binlog 里面已经记录了“把 c 从 0 改成 1”这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 c 的值就是 1,与原库的值不同。

    可以看到,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

    不只是误操作后需要用这个过程来恢复数据,当你需要扩容的时候,也就是需要再多搭建一些备库来增加系统的读能力的时候,现在常见的做法也是用全量备份加上应用 binlog 来实现的,这个“不一致”就会导致你的线上出现主从数据库不一致的情况。

    简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致

    MySQL以binlog的写入与否作为事务是否成功的标记,innodb引擎的redo commit标记并不是这个事务成功与否的标记。

    崩溃时:

    ​ 扫描最后一个Binlog文件,提取其中所有的xid。

    ​ InnoDB维持了状态为Prepare的事务链表,将这些事务的xid与刚刚提取的xid做比较,若存在,则提交prepare的事务,若不存在,回滚。

    举例一个完整的交易流程

    - 账本记上 卖一瓶可乐(redo log为 prepare状态),然后收钱放入钱箱(bin log记录)然后回过头在账本上打个勾(redo log置为commit)表示一笔交易结束。

    - 如果收钱时交易被打断,回过头来整理此次交易,发现只有记账没有收钱,则交易失败,删掉账本上的记录(回滚)

    - 如果收了钱后被终止,然后回过头发现账本有记录(prepare)而且钱箱有本次收入(bin log),则继续完善账本(commit),本次交易有效。

    4、两个参数

    • innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log都直接持久化到磁盘。这个参数我建议你设置成 1,这样可以保证 MySQL 异常重启之后数据不丢失。
    • sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证 MySQL 异常重启之后 binlog 不丢失。
    展开全文
  • 【python】MySQLdb执行sql文件命令

    千次阅读 2013-09-25 08:36:47
    纠结了半天,最后把sql文件中多余的空行及所有注释去掉,然后这样执行命令就OK了: for line in open('xxx.sql', 'r'): cursor.execute(line) 这应该是最简单的顺序执行命令方法了,但需要更改sql文件
  • 2019-08-09 SQL如何执行SQL执行Oracle中的sql是如何执行,什么是硬解析和软解析;Mysql中的sql是如何执行的,MySQL的体系结构又是怎样的;什么事存储引擎,Mysql的存储引擎都有哪些?Oracle中的sql是如何执行Sql语句...
  • 还可以将SQL语句放到一个文件中然后告诉mysql从该文件读取输入。要想实现,创建一个文本文件text_file,并包含你想要执行的语句。然后按如下所示调用mysql: shell>mysqldb_nametext_file 还可以用一个USEdb_name...
  • IBatis 怎样直接执行SQL语句

    千次阅读 2016-02-17 10:17:51
    有时候,为了代码灵活,便于修改,要直接向IBatis传入完整的SQL语句。ibatis map 文件如下: remapResults="true" parameterClass="java.util.HashMap"> $sql$ $sql$ 其中最重
  • 会在SQL*Plus中执行单个sql脚本文件SQL>@c:\aaa.sql但是现在有大量sql脚本...再写一个sql文件把需要执行的其他sql文件作为这个文件中的调用.@file1.sql@file2.sql...@filen.sql   ======================...
  • 转载:http://joewalker.iteye.com/blog/408879命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名;导出整个数据库结构和数据mysqldump -h localhost -... dump.sql导出单个数据表结构...
  • c# vs2013+sql2008r2 直接执行.sql脚本文件怎样把.sql脚本文件能想在SSM中执行的脚本一样,这样我们就可以在程序中调用不同脚本执行后续的需求就不需要改动代码,同时也可以给非程序人员一个更简单的操作,只需要...
  • 首先感谢博主,然后来写一些自己的建议: ...1、问题出现的原因:.sql文件的编码格式与MySQL不同 2、解决乱码的问题 ①通过cmd进入mysql下的bin文件下 执行:cdD:\MYSQL\bin ②执行: mysql -u root -p ...
  • 怎样将一个SQL语句的文本文件导入到access批处理执行? 这个文本文件里是如此内容: CREATE TABLE tb_config ( app_name VARCHAR( 64 ) NOT NULL, key_name VARCHAR( 64 ) NOT NULL, key_value VARCHAR( ...
  • 在公司的项目中看到有一些xxx.sql的脚本文件,而且在启动项目时看日志发现确实运行 ...执行sql脚本文件相关,所以希望大侠帮助我解答下 Hibernate或者 Java 怎样运行xxx.sql的脚本文件,验证一下我的猜想,,
  • 本节将介绍怎样利用批处理脚本去调用 mysql 执行 sql 脚本。...当我们版本变多时,sql文件也就将变多。如下图:上图中,1.0.0-*.sql ~ 1.2.0-*.sql 为每个版本的数据库 SQL 脚本。version.txt 文件...
  • 【前言】 mysql可以记录用户执行的sql:记录到文件、表格 mysql可以定义执行多少时间以上...其实只要搞清楚了mysql怎样记录执行sql怎样记录慢查询的即可 接下来就是写代码去梳理成报告,我这里使用的是pytho...
  • 在开发中,为了便于管理,可能会将每个存储过程和函数的sql单独放在一个.sql文件中,这样就会造成N多个.sql文件,如果需要将这些文件都执行的话就很麻烦,所以想了个办法一次执行所有的sql文件。1. 这次拿到手上的...
  • mysql慢查询日志是mysql日共记录日志的一种也是帮助定位查询较慢的sql的一种手段,他用来记录超过long_query_time设定值的sql,超过这个阀值mysql就会将其记录下来,写进slow_query_log_file配置好的日志文件中。...
  • 1.有一个excel文件,文件中定义好字段。 ...普通-->...3.最后会生成一个.sql文件,里面就是sql语句. 4.导入sql语句到oracle数据库中就可以了. 转载于:https://www.cnblogs.com/qadyyj/p/5307116.html...
  • 在linux环境下,执行一个sh脚本,里面包含了spool,里面包含查询语句,将查询结果指定到了一个txt文件,然后我需要知道这个语句是否执行成功。然后再导到另外的日志txt里面去。 求大神解决,或者推荐别的方法。
  • 怎样才能将sql server 2012的数据库实例中的bin可执行文件部分放到c盘,数据部分放到d盘 因为公司是希望C盘是程序,为避免病毒等,以后就固定不要动了 D盘放以后每天工作变动的东西 多谢!
  • SQL注入__0x01♛Sql注入原理Sql注入顾名思义是没有对用户输入的参数进行过滤导致测试者可以将一段非正常语句插入到查询语句中,由web应用带入到数据库中执行,从而读取数据库中的数据。__0x02♛Sql注入利用条件:☀...
  • 降低版本,附加 sql2000数据库 怎样把SQL2005的数据库转换成SQL2000的数据库用...1.导出数据库语法为Sql文件. 2.到户所有数据到Maccess件(mdb) 3.新建2000数据库. 4.在库中执行创建的sql语法. 5.导入access中的数据.

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 277
精华内容 110
关键字:

怎样执行sql文件