ORACEL 备份数据库错误 ORA-3041 解决办法

转自:https://blog.csdn.net/tom0421/article/details/693985

点评:文单写得很详细,

诊断并解决ORA-04031 错误

当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031 错误。

当这个错误出现的时候你得到的错误解释信息类似如下:

04031, 00000, "unable to allocate %s bytes of shared memory (/"%s/",/"%s/",/"%s/",/"%s/")" 
// *Cause: More shared memory is needed than was allocated in the shared 
// pool. 
// *Action: If the shared pool is out of memory, either use the 
// dbms_shared_pool package to pin large packages, 
// reduce your use of shared memory, or increase the amount of 
// available shared memory by increasing the value of the 
// INIT.ORA parameters "shared_pool_reserved_size" and 
// "shared_pool_size". 
// If the large pool is out of memory, increase the INIT.ORA 
// parameter "large_pool_size".

1.共享池相关的实例参数

在继续之前,有必要理解下面的实例参数:

  • SHARED_POOL_SIZE
    这个参数指定了共享池的大小,单位是字节。可以接受数字值或者数字后面跟上后缀”K” 或 “M” 。”K”代表千字节, “M”代表兆字节。
  • SHARED_POOL_RESERVED_SIZE
    指定了为共享池内存保留的用于大的连续请求的共享池空间。当共享池碎片强制使 Oracle 查找并释放大块未使用的池来满足当前的请求的时候,这个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降。
  • 这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对象。既然操作系统内存可以限制共享池的大小,一般来说,你应该设定这个参数为 SHARED_POOL_SIZE 参数的 10% 大小。
  • SHARED_POOL_RESERVED_MIN_ALLOC 这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到,内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值,那么Oracle 服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 和更高的版本中是隐藏的。提交如下的语句查找这个参数值:
    SELECT   nam.ksppinm NAME, val.ksppstvl VALUE
        FROM x$ksppi nam, x$ksppsv val
       WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'
    ORDER BY 1;
    

    10g 注释:Oracle 10g 的一个新特性叫做 “自动内存管理” 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来说,当数据库需要分配一个大的对象到共享池中并且不能找到连续的可用空间,将自动使用其他SGA结构的空闲空间来增加共享池的大小 。既然空间分配是Oracle自动管理的,ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被激活。当前设定可以通过查询v$sga_dynamic_components 视图获得。请参考10g管理手册以得到更多内容 。

2.诊断ORA-04031 错误

注:大多数的常见的 ORA-4031 的产生都和 SHARED POOL SIZE 有关,这篇文章中的诊断步骤大多都是关于共享池的。 对于其它方面如Large_pool或是Java_pool,内存分配算法都是相似的,一般来说都是因为结构不够大造成。

ORA-04031 可能是因为 SHARED POOL 不够大,或是因为碎片问题导致数据库不能找到足够大的内存块。

ORA-04031 错误通常是因为库高速缓冲中或共享池保留空间中的碎片。 在加大共享池大小的时 候考虑调整应用,使用共享的SQL 并且调整如下的参数:

SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.

首先判定是否ORA-04031 错误是由共享池保留空间中的库高速缓冲的碎片产生的。提交下的查询:

SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
       last_failure_size
  FROM v$shared_pool_reserved;

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC

那么ORA-04031 错误就是因为共享池保留空间缺少连续空间所致。要解决这个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进共 享池保留空间的对象数目,并增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 来加大共享池保留空间的可用内存。

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

或者

REQUEST_FAILURES 等于0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误。

第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留空间中并且加大SHARED_POOL_SIZE。

3.解决ORA-04031 错误

  • ORACLE BUGOracle推荐对你的系统打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关,可以通过使用这些补丁来避免。下面表中总结和和这个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁。
    BUG 描述 Workaround Fixed
    <Bug:1397603> ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles _db_handles_cached = 0 901/ 8172
    <Bug:1640583> ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access Not available 8171/901
    <Bug:1318267> INSERT AS SELECT statements may
    not be shared when they should be
    if TIMED_STATISTICS. It can lead to ORA-4031
    _SQLEXEC_PROGRESSION_COST=0 8171/8200
    <Bug:1193003> Cursors may not be shared in 8.1
    when they should be
    Not available 8162/8170/ 901
    <Bug:2104071> ORA-4031/excessive “miscellaneous” shared pool usage possible. (many PINS) None-> This is known to affect the XML parser. 8174, 9013, 9201
    <Note:263791.1> Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset Not available 9205
  • 编译Java代码时出现的ORA-4031在你编译Java代码的时候如果内存溢出,你会看到错误:
    A SQL exception occurred while compiling: : 
    ORA-04031: unable to allocate bytes of shared memory 
    ("shared pool","unknown object","joxlod: init h", "JOX: ioc_allocate_pal") 
    

    解决办法是关闭数据库然后把参数 JAVA_POOL_SIZE 设定为一个较大的值。这里错误信息中提到的 “shared pool” 其实共享全局区(SGA)溢出的误导,并不表示你需要增加SHARED_POOL_SIZE,相反,你必须加大 JAVA_POOL_SIZE 参数的值,然后重启动系统,再试一下。参考: <Bug:2736601> 。

  • 小的共享池尺寸很多情况下,共享池过小能够导致ORA-04031错误。下面信息有助于你调整共享池大小:
    • 库高速缓冲命中率命中率有助于你衡量共享池的使用,有多少语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率:
      SELECT SUM(PINS) "EXECUTIONS", 
                  SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" 
                  FROM V$LIBRARYCACHE; 
      

      如果丢失超过1%,那么尝试通过加大共享池的大小来减少库高速缓冲丢失。

    • 共享池大小计算要计算最适合你工作负载的共享池大小,请参考:<Note:1012046.6>: HOW TO CALCULATE YOUR SHARED POOL SIZE.
  • 共享池碎片每一次,需要被执行的SQL 或者PL/SQL 语句的解析形式载入共享池中都需要一块特定的连续的空间。数据库要扫描的第一个资源就是共享池中的空闲可用内存。一旦空闲内存耗尽,数据库要查找一块已经分配但还没使用的内存准备重用。如果这样的确切尺寸的大块内存不可用,就继续按照如下标准寻找:
    • 大块(chunk)大小比请求的大小大
    • 空间是连续的
    • 大块内存是可用的(而不是正在使用的)

    这样大块的内存被分开,剩余的添加到相应的空闲空间列表中。当数据库以这种方式操作一段时间之后,共享池结构就会出现碎片。

    当共享池存在碎片的问题,分配一片空闲的空间就会花费更多的时间,数据库性能也会下降(整个操作的过程中,”chunk allocation”被一个叫做”shared pool latch” 的闩所控制) 或者是出现 ORA-04031 错误errors (在数据库不能找到一个连续的空闲内存块的时候)。

    参考 <Note:61623.1>: 可以得到关于共享池碎片的详细讨论。

    如果SHARED_POOL_SIZE 足够大,大多数的 ORA-04031 错误都是由共享池中的动态SQL 碎片导致的。可能的原因如下:

    • 非共享的SQL
    • 生成不必要的解析调用 (软解析)
    • 没有使用绑定变量

    要减少碎片的产生你需要确定是前面描叙的几种可能的因素。可以采取如下的一些方法,当然不只局限于这几种: 应用调整、数据库调整或者实例参数调整。

    请参考 <Note:62143.1>,描述了所有的这些细节内容。这个注释还包括了共享池如何工作的细节。

    下面的视图有助于你标明共享池中非共享的SQL/PLSQL:

    • V$SQLAREA 视图这个视图保存了在数据库中执行的SQL 语句和PL/SQL 块的信息。下面的SQL 语句可以显示给你带有literal 的语句或者是带有绑定变量的语句:
      SELECT   SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),
               SUM (executions) "TotExecs"
          FROM v$sqlarea
         WHERE executions < 5
      GROUP BY SUBSTR (sql_text, 1, 40)
        HAVING COUNT (*) > 30
      ORDER BY 2;
      

      注: Having 后的数值 “30” 可以根据需要调整以得到更为详细的信息。

    • X$KSMLRU 视图这个固定表x$ksmlru 跟踪共享池中导致其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了大的应用。如果很多对象在共享池中都被阶段性的刷新可能导致响应时间问题并且有可能在对象重载入共享池中的时候导致库高速缓冲闩竞争问题。关于这个x$ksmlru 表的一个不寻常的地方就是如果有人从表中选取内容这个表的内容就会被擦除。这样这个固定表只存储曾经发生的最大的分配。这个值在选择后被重新设定这样接下来的大的分配可以被标记,即使它们不如先前的分配过的大。因为这样的重置,在查询提交后的结果不可以再次得到,从表中的输出的结果应该小心的保存。监视这个固定表运行如下操作:
      SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;
      

      这个表只可以用SYS用户登录进行查询。

    • X$KSMSP 视图 (类似堆Heapdump信息)使用这个视图能找出当前分配的空闲空间,有助于理解共享池碎片的程度。如我们在前面的描述,查找为游标分配的足够的大块内存的第一个地方是空闲列表( free list)。 下面的语句显示了空闲列表中的大块内存:
      SELECT   '0 (<140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",
               COUNT (*) "Count", MAX (ksmchsiz) "Biggest",
               TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz < 140 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)
      UNION ALL
      SELECT   '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),
               COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
               TRUNC (SUM (ksmchsiz)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)
      UNION ALL
      SELECT   '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),
               COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
               TRUNC (SUM (ksmchsiz)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)
      UNION ALL
      SELECT   '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),
               COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
               TRUNC (SUM (ksmchsiz)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)
      UNION ALL
      SELECT   '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),
               COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
               TRUNC (SUM (ksmchsiz)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz >= 4108 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);
      

4. ORA-04031 错误与 Large Pool

大池是个可选的内存区,为以下的操作提供大内存分配:

  • MTS会话内存和 Oracle XA 接口
  • Oracle 备份与恢复操作和I/O服务器进程用的内存(缓冲)
  • 并行执行消息缓冲

大池没有LRU列表。这和共享池中的保留空间不同,保留空间和共享池中其他分配的内存使用同样的LRU列表。大块内存从不会换出大池中,内存必须是显式的被每个会话分配并释放。一个请求如果没有足够的内存,就会产生类似这样的一个ORA-4031错误:

ORA-04031: unable to allocate XXXX bytes of shared memory 
("large pool","unknown object","session heap","frame") 

这个错误发生时候可以检查几件事情:

  • 1- 使用如下语句检查 V$SGASTAT ,得知使用和空闲的内存:
    SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool'; 
    
  • 2- 你还可以采用 heapdump level 32 来 dump 大池的堆并检查空闲的大块内存的大小从大池分配的内存如果是LARGE_POOL_MIN_ALLOC 子节的整块数有助于避免碎片。任何请求分配小于LARGE_POOL_MIN_ALLOC 大块尺寸都将分配LARGE_POOL_MIN_ALLOC的大小。一般来说,你会看到使用大池的时候相对共享池来说要用到更多的内存。通常要解决大池中的ORA-4031错误必须增加 LARGE_POOL_SIZE 的大小。

 

5. ORA-04031 和共享池刷新

有一些技巧会提高游标的共享能力,从而共享池碎片和ORA-4031都会减少。最佳途径是调整应用使用绑定变量。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到 (要注意那会导致执行计划改变,所以建议先对应用进行测试)。当上述技巧都不可以用的时候,并且碎片问题在系统中比较严重,刷新共享持可能有助于减轻碎片问题。但是,必须加以如下考虑:

  • 刷新将导致所有没被使用的游标从共享池删除。这样,在共享池刷新之后,大多数SQL和PL/SQL游标必须被硬解析。这将提高CPU的使用,也会加大Latch的活动。
  • 当应用程序没有使用绑定变量并被许多用户进行类似的操作的时候(如在OLTP系统中) ,刷新之后很快还会出现碎片问题。所以共享池对设计糟糕的应用程序来说不是解决办法。
  • 对一个大的共享池刷新可能会导致系统挂起,尤其是实例繁忙的时候,推荐在非高峰的时候刷新

6. ORA-04031错误的高级分析

如果前述的这些技术内容都不能解决ORA-04031 错误,可能需要额外的跟踪信息来得到问题发生的共享池的快照。

调整init.ora参数添加如下的事件得到该问题的跟踪信息:

event = "4031 trace name errorstack level 3" 
event = "4031 trace name HEAPDUMP level 3" 

如果问题可重现,该事件可设定在会话层,在执行问题语句之前使用如下的语句:

SQL> alter session set events '4031 trace name errorstack level 3'; 
SQL> alter session set events '4031 trace name HEAPDUMP level 3'; 

把这个跟踪文件发给Oracle支持人员进行排错。

重要标注: Oracle 9.2.0.5 和Oracle 10g 版本中,每次在发生ORA-4031 错误的时候会自动创建一个跟踪文件,可以在user_dump_dest 目录中找到。如果你的系统是上述的版本,你不需要再进行前面描述中的步骤。

 

 

 

====================

另外简单的办法是直接修改stream pool

alter system flush shared_pool;

清空Shared pool:

alter system flush shared_pool;

但为了整个内存的清空,只好将整个Oracle RAC环境的实例和数据库都关机,再重新启动。

可以采用清空buffer cache的方式来做:

alter system flush buffer_cache;

alter system set streams_pool_size=48m scope=both

ardiuno i2c显示器

1.把 Adafruit_GFX  Adafruit_SSD1306  Adafruit_ssd1306syp压缩成 zip 文件

ardiuno 导入以上三个库文件。

接线

ardiuno   i2c显示器

8  —– sda

9——-scl

#include
#define SDA_PIN 8
#define SCL_PIN 9
Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
void setup()
{
delay(1000);
display.initialize();
}
void loop()
{
display.drawLine(0, 0, 127, 63,WHITE);
display.update();
delay(1000);
display.clear();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(“Hello, world!”);
display.setTextColor(BLACK, WHITE); // ‘inverted’ text
display.println(3.141592);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(“0x”);
display.println(0xDEADBEEF, HEX);
display.update();
delay(2000);
display.clear();
}

显示结果为一条斜线,

hello world

3.14

OXDEADBEEF

物联网开发:PYBOARD 驱动电机

接线:
pyboard v102 —- L298N

Y1                     —- N1
Y2                     —- N2
Y3                     —- N3
Y4                     —- N4

同时拔掉板载5V使能跳线帽

l298n—-电机
OUT3 — 电机V++
OUT4 — 电机GND

OUT1 — 电机V++
OUT2 — 电机GND

关键代码:

 

y1 = Pin('Y1', Pin.OUT_PP) 
y2 = Pin('Y2', Pin.OUT_PP) 
x1 = Pin('Y3', Pin.OUT_PP) 
x2 = Pin('Y4', Pin.OUT_PP)

start1=Timer(1,freq=10000,callback=start) stop1=Timer(4,freq=2,callback=stop)

y2.heigh() 
y1.low() 
x2.heigh() 
x1.low()

ESP8266交叉编译器xtensa-lx106-elf 在Linux下编译与生成

转发来源:https://blog.csdn.net/flyingcys/article/details/71357261

一、编译环境配置

由于编译crosstool-NG依赖编译环境,本次编译在Ubuntu_16.04.2_64bit下进行,gcc版本为5.4.0,make版本为4.1,可通过gcc -v/make -v查看。
文本后续提到的在编译过程中出现的错误都是基于当前环境下的,如编译环境不一致导致其他错误,可按照类似方法解决。
在编译crosstool-NG之前,我们先安装编译需要的软件包,通过以下命令一次性安装完成:
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev-amd64 python-serial libexpat-dev
使用apt-get之前先确定下软件下载源在国内还是国外,推荐使用国内的阿里云镜像或163镜像速度比较快,不然下载速度就杯具了!记得下载前先sudo apt-get update下。

二、crosstool_NG下载

ESP8266内置Tensilical L106 32bit微处理器,我们使用的是大侠jcmvbkbc制作的Xtensa系列crosstool-NG,可在https://github.com/jcmvbkbc/crosstool-NG查看crosstool-NG源文件。
在命令行输入:git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git ,git clone -b表示只克隆lx106分支,该分支下总共有30425个文件,git表示网络有些慢,需要一些时间。
经过漫长的等待后Clone终于完成,进入crosstool-NG文件夹,我们可以看到:

1.在该目录下执行:./bootstrap

./configure

make

sudo make install
当然也可分开执行4条依次执行。
其中:
./bootstrap通过autoconf生成.configure
./configure –prefix=`pwd`将检查依赖文件包,并通过–prefix配置安装路径为当前目录。pwd指令前后的为反单引号(tab键上面那个按键)。在linux的bash中,其用法同$()相同,用“括起来的内容为一个变量,`pwd`就是当前目录。
如缺少安装软件包某软件包,./configure将自动终止直至安装完成。
我在安装中出现了如下错误:
1)缺少libtool。
解决方法:sudo apt-get install libtool

发现已经安装了libtool,但是版本为2.4.6-0.1版。版本太高了?只能手动安装了!!

① 删除已安装版本sudo apt-get remove libtool
② 至ftp://ftp.gnu.org/gnu/libtool/下载libtool-1.5.26版,并解压libtool-1.5.26目录
③ 在libtool-1.5.26目录下依次执行
a)./configure
b)make
c)sudo make install
libtool完成安装
2.在该目录下执行:./ct-ng xtensa-lx106-elf

三、crosstool_NG配置

crosstool-NG默认配置也可以编译生成Esp8266交叉工具链,但是编译时间特别长,而且特别容易出错。针对这2点进行一些配置。
在crosstool-NG目录下执行./ct-ng menuconfig进行配置

1.配置多线程编译
“Paths and misc options”->“Number of parallel jobs”

默认为0,设置为4;
这个数字不易过大,常见修改方式:CPU内核数*2;如当前PC的CPU为双核,那这里就设置为4;
以上配置设置完成后,在后续执行./ct-ng build时无需手工指定参数。即无需./ct-ng build.4(其实内部还是通过make -j4去执行)。
2.保存编译中间步骤
“Paths and misc options”->“Debug crosstool-NG”->“Save intermediate steps”

crosstool-NG默认配置下每次编译都是重新开始的,无论上一次编译到哪一步,是否成功!
以上配置设置完成后,在后续执行./ct-ng build
完成以上设置后,保存并退出。

四、crosstool_NG编译

完成以上设置后,在crosstool-NG目录下执行./ct-ng build开始编译。编译过程分多个步骤:
1.下载源码包:本次编译需要的源码包有:
gcc-4.8.2
cloog-0.18.4
binutils-2.24
gdb-7.5.1
gmp-5.1.3.tar
isl-0.12
mpc-1.0.2
mpfr-3.1.2.tar
需要下载的源码包名称及版本在根目录下.config文件内配置。源码包下载至根目录下.build/tarballs目录,配置文件和目录为隐藏目录,在Ubuntu下需要按ctrl+h显示才能看到。.config文件和.build/tarballs目录在后面我们都要用到。

2.自动/手动下载源码包
a)自动下载:
在crosstool-NG目录下执行./ct-ng build及开始编译前的第一步工作,编译依赖包下载,该步骤根据网络情况和服务器情况不同,非常耗时。
在未知源码包名称及版本情况下,可一步一步根据build后日志上显示的源码包文件名、版本号、下载路径去下载,然后放至.build/tarballs。下载完一个后,再执行./ct-ng build来确定下一个包。
b)手动下载:我们通过查看根目录下.config文件,得到源码包名称及版本号。下载完成后全部放至.build/tarballs。以下为下载地址:
gcc-4.8.2:ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.2/
cloog-0.18.4:http://www.cloog.org/
binutils-2.24:ftp://ftp.gnu.org/gnu/binutils/
gdb-7.5.1:ftp://ftp.gnu.org/gnu/gdb/
gmp-5.1.3.tar:ftp://ftp.gnu.org/gnu/gmp/
isl-0.12:http://isl.gforge.inria.fr/
mpc-1.0.2:ftp://ftp.gnu.org/gnu/mpc/
mpfr-3.1.2.tar:ftp://ftp.gnu.org/gnu/mpfr/
如果在windows系统下下载以上软件,建议不要使用迅雷等下载工具。将以上下载文件copy至.build/tarballs,然后在根目录下执行./ct-ng build。然后开始满足的编译过程,根据电脑配置不同时间不同,需要耐心等待。

可以看到,我们配置的保存编译过程,可以在出错后只从出错未知开始重新编译

如编译过程中binutils_for_host出错,我们可以直接执行 ./ct-ng binutils_for_host+,之前编译过的就不需要重复运行。

一次性成功,耗时27分钟!是不是感觉so easy?
编译完成的交叉编译器在更目录下builds下,文件名为xtensa-lx106-elf

到这里,我们的交叉编译器生成工作已完成了95%,那剩下的5%呢?现在我们就把xtensa-lx106-elf到Ubuntu系统目录下,编译一下esp8266的工程试试!

五、xtensa-lx106-elf测试

1.在build目录下执行sudo cp -f xtensa-lx106-elf /opt并正确配置环境变量,ubuntu下环境变量配置可参照《Linux环境变量设置》一文。
2.
在github上下载最新esp8266的rtos版本sdk至本地
git clone https://github.com/espressif/ESP8266_RTOS_SDK
ESP8266_RTOS_SDK在linux工程运行配置请参照本文博客《ESP8266交叉编译环境搭建之linux篇》一文,这里不再重复叙述。
运行SDK内部的sample,你就会发现,编译出错了,这就是我们剩下的5%的工作。
1)提示缺少stdint.h文件

执行wget -O include.tgz https://github.com/esp8266/esp8266-wiki/raw/master/include.tgz
下载并解压至交叉编译器对应文件夹
sudo tar zxvf include.tgz -C /opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/
2)提示缺少libhal.a文件

 

 

ubuntu16.04同时使用 pyhton2.7和3.5,并随意切换

ubuntu16.04中默认已经安装了python2.7和python3.

 

开始,

跳到系统目录 并检测版本
cd /usr

cd /bin

/usr/bin$ ls |grep python

dh_python2
dh_python3
python
python2
python2.7
python2.7-config
python2-config
python3
python3.5
python3.5m
python3m
python-config
x86_64-linux-gnu-python2.7-config
x86_64-linux-gnu-python-config

/usr/bin$ python

Python 2.7.12 (default, Nov 19 2016, 06:48:10)

 

$sudo update-alternatives –install /usr/bin/python python /usr/bin/python2 100

$ sudo update-alternatives –install /usr/bin/python python /usr/bin/python3 150

 

以后可以进行切换了

核心命令

sudo update-alternatives  – -config python

水晶报表有用户数目限制

 

.net自带的水晶报表可以支持多个用户同时访问吗,有用户数量的限制吗?

不注册好像是有用户数目限制的,记得好像是5个
可以,不過你要先改注冊表消除並發限制,像這樣:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\Server]
“PrintJobLimit”=”1000”

[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\InprocServer]
“PrintJobLimit”=”1000”

[HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 11.0\Report Application Server\Server]
“PrintJobLimit”=”1000”

[HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 11.0\Report Application Server\InprocServer]

“PrintJobLimit”=”1000”

[HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 11.5\Report Application Server\Server]
“PrintJobLimit”=”1000”

[HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 11.5\Report Application Server\InprocServer]

“PrintJobLimit”=”1000”

ubuntu 下使用 jsoncpp库

做项目的时候需要用c++解析json文件, 之前使用的是 libjson 库, 但当g++ 开启 -std=c++11 选项时, 该库的很多功能不能用, 而且还有一些其他的问题, 不推荐使用. 后来采用的是 jsoncpp 库, 可以在ubuntu下用下面的命令安装该库:

[plain] view plain copy

  1. sudo apt-get libjsoncpp-dev libjsoncpp0

库的头文件安装在/usr/include/jsoncpp中, 库API文档默认在/usr/share/doc/libjsoncpp-dev/jsoncpp-api-html/目录下 . jsoncpp 的github主页上也给出了生成库文档的方法. 使用该库的方法很简单, 在你的程序中加入

  1. #include <jsoncpp/json/json.h>

即可.

具体用法参考API文档, 非常简单.

 

、、、、、、、、、、、、、、、、、、、、、

方法二:

重点内容
一.准备:
1.安装 scons
scons是用Python进行编译的,而Linux大版本都带有Python 所以不用安装,只需安装scons即可。在安装scons是有两种方法:
(1)在终端下命令行安装 sudo apt-get install scons
(2)去网站下载源码包编译安装;(个人建议去网站下载源码包自己编译,这样文件路径比较清楚,命令行的安装路径都是系统默认路径,不便查找)http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz
进入解压目录执行如下命令:
Python setup.py install
然后设置环境变量 export MYSCONS=解压路径

export SCONS_LIB_DIR=$MYSCONS/engine
2.安装 jsoncpp
先去官网下载jsoncpp的源码包
http://sourceforge.net/projects/jsoncpp/files/
接下来一次执行命令:
tar -zxf jsoncpp-src-0.5.0.tar.gz
cd jsoncpp-src-0.5.0
scons platform=linux-gcc
mv libs/linux-gcc-5.4.0/libjson_linux-gcc-5.4.0_libmt.so /lib
mv include/json/ /usr/include

sudo mv libjson_linux-gcc-5.4.0_libmt.a /usr/local/lib/json_5.4.0.a

最后两步的执行时不一样的,看你想把文件方在哪个目录,我是放在/usr/lib 下的,头文件放在/usr/include下;

1、下载工具

JsonCpp

http://sourceforge.net/projects/jsoncpp/files/

比如下载的 jsoncpp-src-0.5.0.tar.gz

$ tar -zxvf jsoncpp-src-0.5.0 -C jsoncpp

说明:

① 安装JsonCpp需要下载JsonCpp和Scon还需要机器上有python

② scons又是一个牛叉的工具,功能和GNU make一样,又比make简单多了。scons是python工具,需要先安装好python。

 

2、安装

(1) 安装 scons

   $ sudo apt-get install scons

(2) 切换到 jsoncpp 目录

   $ python /usr/bin/scons platform=linux-gcc

(3) 生成静态和动态库文件

    在jsoncpp/libs/linux-gcc-4.7目录下

          libjson_linux-gcc-4.7_libmt.a

          libjson_linux-gcc-4.7_libmt.so

    $ sudo mkdir /usr/local/lib

(4) 把两个库文件拷贝到/usr/local/lib目录下

    $ sudo cp libjson_linux-gcc-4.7_libmt.* /usr/local/lib

(5) 将静态库重命名为libjsoncpp.a libjsoncpp.so (mv 命令)

 (6)   切换到 jsoncpp/include/json 目录

         $ sudo mkdir /usr/local/include/jsoncpp

         $ sudo cp * /usr/local/include/jsoncpp

3、使用

(1)包含头文件

#include <jsoncpp/json.h>

(2) 编译

加链接选项    -ljsoncpp

 

在linux下运行程序时,发现了error while loading shared libraries这种错误,解决:

./tests: error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or directory
出现这类错误表示,系统不知道xxx.so放在哪个目录下,这时候就要在/etc/ld.so.conf中加入xxx.so所在的目录。
一般而言,有很多的so会存放在/usr/local/lib这个目录底下,去这个目录底下找,果然发现自己所需要的.so文件。
所以,在
sudo gedit /etc/ld.so.conf
中加入/usr/local/lib这一行,保存之后,
再运行:sudo /sbin/ldconfig –v

更新一下配置即可。

Linux下python安装升级步骤详解 | Python2 升级Python3

Linux下python升级步骤 Python2 ->Python3
多数情况下,系统自动的Python版本是2.x
或者yum直接安装的也是2.x
但是,现在多数情况下建议使用3.x
那么如何升级呢?
下面老徐详细讲解升级步骤;

首先下载源tar包
可利用linux自带下载工具wget下载,如下所示:
wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz

下载完成后到下载目录下,解压
tar -xzvf Python-3.3.0.tgz

进入解压缩后的文件夹
cd Python-3.3.0

在编译前先在/usr/local建一个文件夹python3(作为python的安装路径,以免覆盖老的版本)
mkdir /usr/local/python3

开始编译安装
bash ./configure –prefix=/usr/local/python3
make
make install

此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字
mv /usr/bin/python /usr/bin/python_old2

再建立新版本python的链接
ln -s /usr/local/python3/bin/python3/usr/bin/python

这个时候输入
python -V

就会显示出python的新版本信息
[idolaoxu@localhost home]# python -V
Python 3.3.0

PS:如果不建立新安装路径python3,而是直接默认安装,则安装后的新python应该会覆盖linux下自带的老版本,也有可能不覆盖,具体看安装过程了,
这个大家可以自己试验下,当然如果还想保留原来的版本,那么这种方法最好不过了。

<pre>
最后扩充下,
这种方法虽然能安装成功,但是它带来了新的问题,比如yum不能正常用了
修改/usr/bin/yum的第一行为:
‘#!/usr/bin/python_old2
就可以了
</pre>
如上是讲解已经存在Python2的情况下如何升级,如果是第一次安装呢?那更简单,有些步骤直接可省去,直接安装就OK

作者:IDO老徐
链接:https://www.jianshu.com/p/e422ea96c376
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。