ubunt安装配置更新

1.安装ubuntu 16.04

sudo apt-get update

sudo apt-get upgrade

 

2.安装eclipse

​sudo apt-get install eclipse
​sudo apt-get install eclipse-pde
sudo apt-get install eclipse-jet

​sudo apt-get install eclipse
​sudo apt-get install eclipse-pde
sudo apt-get install eclipse-jet

然后我们安装c/c++支持,打开Eclipse,在Help,Install New Software,点workwith后面的Add来添加,
Name:CDT
Location:http://download.eclipse.org/tools/cdt/releases/indigo
然后再work with中选中新加的CDT,等待刷新之后,选择第一个CDT Main Features,一路Next就好了
安装完成后重启Eclipse,就可以新建C++ project了
P.S.如果发现C++工程一堆莫名其妙的错误那么说明没有安装合适的c++编译器,ubuntu自带的gcc编译器是不能编译c++的,我们需要安装g++:
sudo apt-get install g++
之后重启Eclipse就可以了正常编译了​

2.安装mysql支持

$sudo apt-get install mysql-server

$sudo apt-get install mysql-client

//$ sudo yum install mysql-devel -y //RHEL,Centos,Fedora

$ sudo apt-get install libmysqlclient-dev -y  //Ubuntu

如果已经安装成功了,找到mysql.h的文件路径,-I 编译即可
$ sudo find /usr/ -name ‘mysql.h’

$ gcc -I/usr/include/mysql …

sudo apt install libmysql++-dev
http://blog.csdn.net/linrulei11/article/details/7298834

4.安装python

5.FileZilla

6.MonoDevelop

7.安装freetds

下载freetds : http://www.inhhh.com/download/freetds-stable.0.91.tgz
解压 : tar zxvf freetds-stable.0.91.tgz

cd freetds0.91

chmod +x ./configure

sudo ./configure –prefix=/usr/local/freetds–with-tdsver=8.0–enable-msdblib

sudo make
sudo make install

cd /usr/local/freetds0.91/etc/freetds.conf

sudo chmod -x freetds.conf

sudo vi /etc/ld.so.conf
加入一行:
/usr/local/freetds/lib
然后运行以下指令使更改生效:
ldconfig

Arduino 开发 ESP8266上传出错(解决办法)

在windows或linux下使用Arduino这个软件开发ESP8266 NODEMCU这个板子的时候,上传错误提示的解决办法

错误提示

warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

最简单的做法是 GPIO0 即D4与 GND对接

arduino 安装ESP32开发环境(英文)

The ESP32 is currently being integrated with the Arduino IDE like it was done for the ESP8266. There’s an add-on for the Arduino IDE that allows you to program the ESP32 using the Arduino IDE and its programming language. In this tutorial we’ll show you how to install the ESP32 board in the Arduino IDE for Windows. If you’re using Mac Os or Linux follow these instructions instead. 

You may like: ESP32 vs ESP8266 – Pros and Cons

If you have any problems during the installation procedure, take a look at the ESP32 troubleshooting guide.

If you like the ESP32, enroll in our brand new course: Learn ESP32 with Arduino IDE.

Recommended reading: Getting Started with ESP32 Dev Module.

Installing the ESP32 Add-on on Arduino IDE

Important: before starting this installation procedure, make sure you have the latest version of the Arduino IDE installed in your computer. If you don’t, uninstall it and install it again. Otherwise, it may not work. Having the latest Arduino IDE software installed from arduino.cc/en/Main/Software, continue with this tutorial.

IMPORTANT NOTE:

  1. If this is your first time installing the ESP32 on the Arduino IDE, simply follow the installation procedure described below;
  2. If you’ve already installed the ESP32 add-on using the old method, you should remove the espressif folder first. Go to the end of this post to learn how to remove the espressif folder.

1. Installing the ESP32 Board

To install the ESP32 board in your Arduino IDE, follow these next instructions:

1) Open the preferences window from the Arduino IDE. Go to Arduino > Preferences

2) Enter https://dl.espressif.com/dl/package_esp32_index.json into the “Additional Board Manager URLs” field as shown in the figure below. Then, click the “OK” button:

Note: if you already have the ESP8266 boards URL, you can separate the URLs with a comma as follows:

https://dl.espressif.com/dl/package_esp32_index.json, 
http://arduino.esp8266.com/stable/package_esp8266com_index.json

3) Open boards manager. Go to Tools > Board > Boards Manager…

4) Search for ESP32 and press install button for the “ESP32 by Espressif Systems“:

5) That’s it. It should be installed after a few seconds.

2. Deleting the espressif folder

If this is your first time installing the ESP32 on Arduino IDE you can ignore this section.

If you’ve followed the older installation procedure and you’ve manually installed the ESP32 add-on with Git GUI, you need to remove the espressif folder from your Arduino IDE.

To find your espressif folder and Arduino IDE location (installation path), open your Arduino IDE and go to File > Preferences:

Copy the location from the “Sketchbook location” field:

Go to your Arduino IDE location directory: C:\Users\ruisantos\Documents\Arduino and open the hardware folder:

Then, delete the espressif folder:

Testing the Installation

Plug the ESP32 board to your computer. Then, follow these steps:

1) Open the Arduino IDE

2) Select your Board in Tools > Board menu (in my case it’s the DOIT ESP32 DEVKIT V1)

 

3) Select the Port (if you don’t see the COM Port in your Arduino IDE, you need to install the ESP32 CP210x USB to UART Bridge VCP Drivers):

4) Open the following example under File > Examples > WiFi (ESP32) > WiFi Scan

5) A new sketch opens:

6) Press the Upload button in the Arduino IDE. Wait a few seconds while the code compiles and uploads to your board.

7) If everything went as expected, you should see a “Done uploading.” message.

8) Open the Arduino IDE Serial Monitor at a baud rate of 115200:

9) Press the ESP32 on-board Enable button and you should see the networks available near your ESP32:

Wrapping Up

This is a very basic tutorial that illustrates how to prepare your Arduino IDE for the ESP32 on a Windows PC. To install the Arduino IDE on Mac OS or Linux, follow these instructions instead. If you encounter any issues during the installation procedure, take a look at the ESP32 troubleshooting guide.

You might also like reading:

Thanks for reading.

文章转自:https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/

ARDIUNO ESP32 发开板管理网址

ARDIUNO  发开板管理网址是

https://dl.espressif.com/dl/package_esp32_index.json,

http://arduino.esp8266.com/stable/package_esp8266com_index.json,
https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.json

 

https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.json 是2018-8-10添加的,发现了很多问题,不能#include <uart.h>

不能#include <softwareseial.h> 不知道是不是少了东西。2018-8-14重新添加

https://dl.espressif.com/dl/package_esp32_index.json,

开始测试下。

如何在Ubuntu 16.04上安装Webmin

Webmin是任何Linux机器的易于使用,现代化的Web控制面板。它允许您通过简单的界面管理您的服务器。使用Webmin,您可以即时更改常用软件包的设置。在本教程中,您将安装…

 

介绍

Webmin是任何Linux机器的现代化Web控制面板。 它允许您通过简单的界面来管理您的服务器。 使用Webmin,您可以即时更改常用软件包的设置。

在本教程中,您将在服务器上安装和配置Webmin,并使用Let’s Encrypt安全地访问具有有效证书的接口。 然后,您将使用Webmin添加新的用户帐户,并从仪表板更新服务器上的所有软件包。

先决条件

要完成本教程,您将需要:

第1步 – 安装Webmin

首先,我们需要添加Webmin存储库,以便我们可以使用我们的软件包管理器轻松地安装和更新Webmin。 我们通过将存储库添加到/etc/apt/sources.list文件来实现。

在编辑器中打开文件:

sudo nano /etc/apt/sources.list

然后将此行添加到文件的底部以添加新的存储库:

/etc/apt/sources.list
 . . . 
deb http://download.webmin.com/download/repository sarge contrib

保存文件并退出编辑器。

接下来,添加Webmin PGP密钥,以便您的系统将信任新的存储库:

wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc

接下来,更新包含Webmin信息库的软件包列表:

sudo apt-get update 

然后安装Webmin:

sudo apt-get install webmin 

安装完成后,您将看到以下输出:

Webmin install complete. You can now login to 
https://your_server_ip:10000 as root with your 
root password, or as any user who can use `sudo`.

请复制此信息,因为您需要下一步。

注意:如果在先决条件步骤中安装了ufw,则需要运行sudo ufw allow 10000命令,以便允许Webmin通过防火墙。 为了额外的安全性,您可能希望将防火墙配置为仅允许从某些IP范围访问此端口。

我们通过添加有效的证书来安全地访问Webmin。

Webmin已配置为使用HTTPS,但它使用自签名不可信证书。 让我们用“加密”中的有效证书替换它。

导航到您的Web浏览器中的https:// your_domain :10000 ,将your_domain your_domain为您在服务器上指向的域名。

注意:首次登录时,您将看到“无效的SSL”错误。 这是因为服务器已经生成了一个自签名证书。 允许异常继续,以便您可以使用我们的加密中的一个替换自签名证书。

您将看到一个登录屏幕。 使用您创建的非root用户登录,同时满足本教程的先决条件。

登录后,您将看到的第一个屏幕是Webmin仪表板。 在应用有效的证书之前,必须设置服务器的主机名。 查找系统主机名字段并点击右侧链接,如下图所示:

显示Webmin仪表板链接位置的图像

这将带你到主机名和DNS客户端页面。 找到主机名字段,并在该字段中输入您的完全限定域名。 然后按页面底部的保存按钮应用设置。

设置主机名后,单击左侧导航栏上的Webmin ,然后单击Webmin配置

然后,从图标列表中选择SSL 加密 ,然后选择Let’s Encrypt选项卡。 您将看到如下图所示的屏幕:

显示SSL加密部分的Let's Encrypt选项卡的图像

使用此屏幕,您将告诉Webmin如何获取和更新您的证书。 加密证书在3个月后过期,但我们可以指示Webmin自动尝试每月更新“加密认证证书”。 让我们加密在我们的服务器上查找一个验证文件,所以我们将配置Webmin将验证文件放在文件夹/var/www/html ,这是您在先决条件中配置的Apache Web服务器所使用的文件夹。 按照以下步骤设置证书:

  1. 填写您的FQDN 证书的主机名
  2. 对于验证文件的网站根目录 ,选择其他目录按钮,然后输入/var/www/html
  3. 对于自动续订部分之间的月份通过在输入框中键入1然后选择输入框左侧的单选按钮,取消选择仅手动更新选项。
  4. 单击请求证书按钮。 几秒钟后,您将看到一个确认屏幕。

要使用新证书,请通过单击浏览器中的后退箭头并单击重新启动Webmin按钮重新启动Webmin 。 等待约30秒钟,然后重新加载页面并重新登录。 您的浏览器现在应该指示证书是有效的。

第3步 – 使用Webmin

您现在已经设置了Webmin的安全工作实例。 我们来看看如何使用它。

Webmin有许多不同的模块,可以控制从BIND DNS服务器到将用户添加到系统的简单的一切。 我们来看看如何创建一个新用户,然后探讨如何使用Webmin更新操作系统。

管理用户和组

我们来探讨如何管理您的服务器上的用户和组。

首先,单击系统选项卡,然后单击用户和组按钮。 然后,从这里,您可以添加用户,管理用户,或添加或管理组。

我们来创建一个名为deploy的新用户,用于托管Web应用程序。 要添加用户,请单击创建新用户 ,该用户位于users表的顶部。 这将显示“ 创建用户”屏幕,您可以在其中提供用户名,密码,组和其他选项。 按照以下说明创建用户:

  1. 使用deploy填写用户名
  2. 选择自动用户ID
  3. 使用描述性名称填写实名称 ,如Deployment user
  4. 对于主目录 ,选择自动
  5. 对于Shell ,从下拉列表中选择/ bin / bash
  6. 对于密码 ,请选择“ 正常密码” ,然后输入您选择的密码。
  7. 对于主组 ,选择与用户同名的新组
  8. 对于辅助组 ,从“ 所有组”列表中选择“ sudo ”,然后按– >按钮将组添加到列表中。
  9. 按“ 创建 ”创建此新用户。

创建用户时,可以设置密码到期的选项,用户的shell,或者是否允许其使用主目录。

接下来,我们来看看如何安装我们系统的更新。

更新软件包

Webmin允许您通过其用户界面更新所有的包。 要更新所有软件包,首先,转到Dashboard链接,然后找到软件包更新字段。 如果有更新可用,您将看到一个链接,指出可用更新的数量,如下图所示:

Webmin显示可用更新的数量

单击此链接,然后按更新所选软件包以开始更新。 可能会要求您重新启动服务器,您也可以通过Webmin界面进行操作。

您现在有一个安全的Webmin工作实例,并且您已经使用该界面来创建用户和更新程序包。 Webmin可让您访问通常需要通过控制台访问的许多内容,并以直观的方式组织它们。 例如,如果您安装了Apache,则可以在“服务器”下找到配置选项卡,然后在Apache中找到该配置选项卡。

浏览界面,或阅读官方Webmin wiki ,了解有关使用Webmin管理系统的更多信息。

ubuntu下安装Apache+PHP7.0+Mysql

1.安装之前先更新系统

1 sudo apt update

2.安装Apache2

1 sudo apt install apache2

3.安装PHP

1 sudo apt install php7.0
2 sudo apt-get install libapache2-mod-php7.0

这里一定要用PHP7.0网上的PHP5.0, 或者 直接写PHP,很有问题

4.安装MySQL

1 sudo apt install mysql-server php7.0-mysql
2 sudo apt-get install mysql-client
3 mysql_secure_installation

5.安装phpmyadmin

1 sudo apt-get install phpmyadmin
2 sudo apt-get install php-mbstring
3 sudo apt-get install php-gettext
4 sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

配置phpmyadmin

1 nano /etc/php/7.0/apache2/php.ini
display_errors = On(显示错误日志,出现两次,都要改,不然无效)
extension=php_mbstring.dll (开启mbstring)

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