Exchange传输队列queue数据库越来越大怎么办?

大家好,今天为大家分享一下日常管理中Exchange数据库的一些维护操作。我们知道当我发送邮件时邮件都是先到一个Exchange的临时的队列数据库中,然后再提交到用户邮箱中。随着时间的推移队列数据库大小会不断的增加(查看传输队列数据库位置可以查看EdgeTransport.exe.config文件中的QueueDatabasePath和QueueDatabaseLoggingPath指向的路径即为队列数据库和日志所在位置),此时就需要管理员对传输队列数据库进行维护,减小传输队列数据库的大小或者将传输队列数据库移动到其他磁盘。通常引起传输队列数据库大小不断增加的原因可能是发送大量的邮件或存在发送大附件的邮件。

首先,来看看队列数据库的文件结构。其中mail.que存放的是队列消息文件,也就是队列数据库。由于队列数据库是可扩展存储引擎 (ESE) 数据库,所有有日志检查点文件.chk。.log为日志文件。传输队列数据库设计的时候就自动开启了循环日志,已经写入到数据库的日志会自动清除。

当传输队列数据库文件过大有哪些措施:

方法一、重新生成新的传输队列数据库。

方法二、对传输队列数据库进行整理,释放传输队列数据库空白空间。(此方法也适用于传输队列数据库因为大量邮件投递被迫停止,无法启动)

方法一我相信很多人都试过,就是首先将Exchange传输服务停止,然后将目录C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data下的Queue重命名为一个其他名字(例如:Queue.old),然后重新启动传输服务器,这样会重新生成一个信息队列数据库。这样操作之前要保证当前服务器的传输队列中没有还未投递的邮件,为了防止丢失邮件可以使用命令Get-Queue查看一下邮件队列情况。

下面着重分享一下方法二,在进行方法二操作之前首先要明确此方法可以应用于哪些场景:

1)、当传输队列数据库中堆积大量未发送的邮件,导致传输服务无法正常启动。

方法二的具体操作思路是,首先将传输队列数据库复制粘贴到其他备用位置(此时传输服务应处于停止状态),然后对传输队列数据库进行日志重播、磁盘碎片整理和修复等操作,最好将修复完成的队列数据库复制拷贝到队列数据库对应位置替换现有队列数据库文件(对应生产服务器上如果出现问题的服务器传输服务无法启动,又要及时恢复正常邮件收发,又要保证数据不要丢失;此时我们可以先按照方法一恢复正常邮件收发,然后将恢复后的队列数据库复制到另外的Exchange服务器的传输队列数据库,由其他Exchange服务器来负责将未发送的邮件发送出去。此时需要注意的是新Exchange服务器必须和源Exchange服务器的版本保持一致)

下面我分享一个我之前测试的步骤

1、将传输队列数据库复制到临时目录。

2、打开Powershell,使用命令eseutil.exe /mh  “队列数据库完整路径”,查看数据库的状态,如果State: Dirty Shutdown,说明数据库处于异常关闭状态,需要进行日志重播和数据库修复。

3、接下来使用命令: esetuil  /r trn /d “队列数据库路径” /I  “日志文件路径”  对数据库进行日志重播,如果失败,则进行第四步操作。

4、对传输队列数据库进行日志重播失败后(软修复),只能进行硬修复了。使用命令 :  eseutil.exe /p “数据库完整路径”  /t “临时文件存放目录”

5、接下来使用命令: eseutil.exe /d “数据库路径” /t “临时文件存放路径”    对传输队列数据库进行数据整理,释放空白空间。

6、再次停止传输服务器,将修复后的队列数据库覆盖现有传输队列数据库,然后启动传输服务。(如果传输服务无法启动,需要将C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\queue目录下的其余文件剪切出去,只保留mail.que文件,然后启动传输服务。这样进行此步操作时要保证当前服务器的传输队列中没有未投递的邮件)

我在执行过程中遇到如下问题,我的解决方法是将队列数据库文件复制到其他空目录中,然后再次运行命令进行修复。

时间: 2024-08-27 03:29:25

Exchange传输队列queue数据库越来越大怎么办?的相关文章

如何更改Exchange服务器的传输队列数据库路径

我们都知道如果第一次将Exchange安装在了C盘或者一般空间比较小的分区上.随着Exchange服务器的运行时间推移,发现Exchange队列数据库占用的磁盘空间有时会很大,从而导致磁盘空间紧张.最后可能导致出现SMTP传输的反压力情况发生.发生这种情况的时候通常有两种方式去缓解状况:1.停止SMTP服务器,将旧Queue数据库删除,释放磁盘空间.(这种方法可以临时解决问题):2.更改Queue数据库路径到一个更大的磁盘空间中. 下面给大家分享更改Exchange队列数据库路径的方法, 方法一

Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个"队列"对象 import queue q = queue.Queue(maxsize = 10) queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中: q.put() 调用队列对象的put()方法在队尾插入一个项目.put()

ZooKeeper实现分布式队列Queue

ZooKeeper实现分布式队列Queue 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越便宜,一台非品牌服务器,2颗24核CPU,配48G内存,2T的硬盘,已经降到2万块人民币以下了.这种配置如果简单地放几个web应用,显然是奢侈的浪费.就算是用来实现单节点的hadoop,对计算资源浪费也是非常高的.对于这么高性能的计算机,如何有效利用计算资源,就成为成本控制的一项重要议题了. 通过

c++ STL:队列queue、优先队列priority queue 的使用

说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6.size() 返回队列中元素的个数

RabbitMQ(python实现)学习之二:Producer发送消息至多个消息队列queue(广播消息)

1.1本部分内容简介 这部分我们将要发送一个消息到多个Consumer,这部分称之为"publish/subscribe" 我们实现的方式就是发送端,发送一个消息,与此同时,多个接收端将同时接收到消息并打印在屏幕上面. 1.2exchange简介 在前面的博文中,我们的讲解是:发送端发送消息至消息队列,接收端从消息队列获取消息.现在我们来介绍一下rabbitmq的完整消息传送模型. >Producer:用来发送消息的应用程序 >queue:用来存储消息的缓存 >Con

SQL Server 2008 R2占用内存越来越大解决方法

最近开发sql server数据库项目的过程中发现了这么一个问题,后台网站内存占用95%,通过任务管理器查看占内存的进程sqlserver.exe,是因为SQL Server 2008 R2运行越久,占用内存会越来越大. 因为sql server 2008 本身内存回收机制做的不好 所以只能这么强制设置.现在明白了,原来是微软R2系列的服务器&数据库问题的通病. 方法: 进入Sql server 企业管理器,在数据库服务器名称上点击[右键],选择[属性],然后,找到[内存]选项,在右边的[使用A

使用队列queue实现一个简单的生产者消费者模型

一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的超市又该作何理解呢?诚然,它本身是作为一座交易场所而诞生. 上述情形类比到实际的软件开发过程中,经常会发现:某个线程或模块的代码负责生产数据(工厂),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间使用了队列.栈等类似超市的东西来存储数据(超市),这就抽象除了我们的生产者/消费

TCP发送端收到ACK后对传输队列的4次扫描

TCP如果收到ACK后,不管是顺序ACK还是重复ACK(可能带有SACK选项),都可能对传输队列进行4次扫描,它们先后顺序分别是: 1.第一遍扫面,分别做以下事情: 故事发生在tcp_ack->tcp_sacktag_write_queue函数 1.1.标记被SACK的数据包 故事发生在tcp_ack->tcp_sacktag_write_queue->函数主体 1.2.标记哪些已经重传的包可能丢失 故事发生在tcp_ack->tcp_sacktag_write_queue->

121 python程序中的线程操作-队列queue

一.线程队列 queue队列:使用方法同进程的Queue一样 如果必须在多个线程之间安全地交换信息时,队列在线程编程中尤其有用. 重要: q.put():往队列里面放值,当参数block=Ture的时候,timeout参数将会有作用,当队列已经满了的时候,在往里面放值时,block为True程序将会等待timeout的时间,过了时间程序会报错,block如果为Flase时,程序不会等待直接报错 q.get():从队列里面取值,当参数block=Ture的时候,timeout参数将会有作用,当队列