<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>有所思 - SOTHINK</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/" />
    <link rel="self" type="application/atom+xml" href="https://www.sothink.cn/atom.xml" />
    <id>tag:www.sothink.cn,2009-12-03://1</id>
    <updated>2026-08-03T02:17:58Z</updated>
    <subtitle>The internet should be public, open and accessible ?</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro</generator>

<entry>
    <title>修复 Movable Type 使用访客邮箱作发件人的问题</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2026/07/fix-mt6-commenter-email-as-from.html" />
    <id>tag:www.sothink.cn,2026://1.137</id>

    <published>2026-07-10T09:28:33Z</published>
    <updated>2026-08-03T02:17:58Z</updated>

    <summary> Movable Type（MT）作为一个相当“古老”的内容管理系统，曾经在博客时代非常流行。最近重新维护这个多年没有打理的博客时，发现有几条待审核评论，一直没有收到邮件通知。 经过排查发现，问题出在 Movable Type 的评论通知邮件机制上。...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mt6" label="MT6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　Movable Type（MT）作为一个相当“古老”的内容管理系统，曾经在博客时代非常流行。最近重新维护这个多年没有打理的博客时，发现有几条待审核评论，一直没有收到邮件通知。</p>
<p>　　经过排查发现，问题出在 Movable Type 的评论通知邮件机制上。</p>]]>
        <![CDATA[<p>　　先说说 Movable Type 的邮件发送方式。</p>
<p>　　在默认情况下，MT 会使用访客提交评论时留下的 Email 地址作为邮件的 From（发件人）地址。这个设计在十几年前基本没有问题，而且还有一个优点：管理员收到评论通知邮件后，可以直接点击“回复”，邮件会自动发送给评论者。</p>
<p>　　随着现代邮件系统安全策略的变化，这种设计已经不再适用。现在主流邮件服务商（例如 Gmail 等）都会验证邮件发送域名的 SPF、DKIM 以及 DMARC 认证。如果 SMTP 服务器发送邮件时使用的 From 地址并不属于当前邮件服务器控制的域名，接收方通常会认为这是一封伪造邮件并拒收。例如，本次遇到的错误：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">2026-07-10 13:30:04 1wi3m9-000000072Tb-3X2f ** vistor@example.com R=dnslookup T=remote_smtp H=gmail-smtp-in.l.google.com [192.178.164.26]

SMTP error from remote mail server after pipelined end of data:

550-5.7.26 Your email has been blocked because the sender is unauthenticated.
550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM.

Authentication results:
DKIM = did not pass
<span style="color: #e03e2d;">SPF [] with ip: [100.100.100.100] = did not pass</span></pre>
<p></p>
<p>　　从上面的日志可以看到，邮件服务器实际发送 IP 并没有通过 Gmail 的 SPF/DKIM 验证，邮件直接被拒收。</p>
<p><strong>问题定位</strong></p>
<p>　　下面以 Movable Type 6 为例，通过检查 Movable Type 的邮件发送代码，发现评论通知邮件发送逻辑位于 lib/MT/App.pm 中的 _send_comment_notification 函数，其中原始代码逻辑如下：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">require MT::Mail;
my $author = $entry-&gt;author;
$app-&gt;set_language( $author-&gt;preferred_language )
    if $author &amp;&amp; $author-&gt;preferred_language;
my $from_addr;
my $reply_to;<br /><span style="color: #e03e2d;">if ( $cfg-&gt;EmailReplyTo ) {</span><br /><span style="color: #e03e2d;">    $reply_to = $comment-&gt;email;</span><br /><span style="color: #e03e2d;">}</span><br /><span style="color: #e03e2d;">else {</span><br /><span style="color: #e03e2d;">    $from_addr = $comment-&gt;email;</span><br /><span style="color: #e03e2d;">}</span><br />$from_addr = $cfg-&gt;EmailAddressMain;<br />$reply_to  = $comment-&gt;email;</pre>
<p></p>
<p>　　当 EmailReplyTo 没有启用时（MT后台没有对应设置，默认也就不会使用System Email），MT 会直接把访客评论留下的邮箱 vistor@<span>example.com</span> 作为邮件的 From 地址 ， 这正是现代邮件系统无法接受的行为。</p>
<p><strong>临时修补方法</strong></p>
<p>　　备份并修改 lib/MT/App.pm ，找到 _send_comment_notification 函数，大约在1570行附近，将原来的逻辑：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">if ( $cfg-&gt;EmailReplyTo ) {<br />    $reply_to = $comment-&gt;email;<br />}<br />else {<br />    $from_addr = $comment-&gt;email;<br />}</pre>
<p></p>
<p>　　修改为：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">$from_addr = $cfg-&gt;EmailAddressMain;<br />$reply_to  = $comment-&gt;email;</pre>
<p></p>
<p>　　修改后邮件头由 From: visitor@example.com To: blog-author@example.com 变为 From: <em>MT SYSTEM EMAIL</em> Reply-To: vistor@<span>example.com</span> To: blog-author@example.com 这样既满足现代邮件系统的 SPF/DKIM 验证要求，又保留了管理员直接回复评论者的便利。</p>
<p>　　如果你的MT System Email设置的是自己的域名邮箱，只需在域名里增加一条TXT记录，将服务器的IP加进去就可以了，比如："v=spf1 include:<span style="color: #7e8c8d;"><em>spf.example.com</em></span> ip4:<span style="color: #7e8c8d;"><em>YourMailServerIP</em></span> ~all"</p>
<p>　　该考虑更换博客程序了。。。</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>抢救因误执行rm -rf 删除的MySQL数据</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2025/03/recovery-of-mysql-database-from-accidental-rm-rf-deletion.html" />
    <id>tag:www.sothink.cn,2025://1.136</id>

    <published>2025-03-13T02:26:05Z</published>
    <updated>2026-07-28T12:09:46Z</updated>

    <summary> 在Linux服务器运维过程中，rm -rf * 命令因其不可逆的破坏性始终伴随着高危风险。不同于桌面环境的回收站机制，该指令一旦执行将直接导致物理存储层面的数据删除。根据文件系统原理，即便使用专业恢复工具，成功恢复的概率仍与磁盘写入状态密切相关，这使得误操作极易造成永久性数据丢失。 下面是一次在Linux下对数据库执行rm -rf *后的恢复过程。涉及两个数据库共240张表，约5GB数据，数据库版本为MySQL 8.0.37。 过程：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="窗外" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="linux" label="Linux" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p><span>　　在Linux服务器运维过程中，rm -rf * 命令因其不可逆的破坏性始终伴随着高危风险。不同于桌面环境的回收站机制，该指令一旦执行将直接导致物理存储层面的数据删除。根据文件系统原理，即便使用专业恢复工具，成功恢复的概率仍与磁盘写入状态密切相关，这使得误操作极易造成永久性数据丢失。</span></p>
<p><span>　　下面是一次在Linux下对数据库执行rm -rf *后的恢复过程。涉及两个数据库共240张表，约5GB数据，数据库版本为MySQL 8.0.37。</span></p>
<p><span><strong>过程：  </strong></span></p>]]>
        <![CDATA[<p>一、文件恢复</p>
<p>　　1、查看打开这些文件的进程ID：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">root@mysql-server:~# lsof -L |grep /data/mysql/data
mysqld     272718                              mysql  cwd       DIR             252,17       20480   14155778 /data/mysql/data
mysqld     272718                              mysql   10uW     REG             252,17    12582912   14155781 /data/mysql/data/ibdata1 (deleted)
mysqld     272718                              mysql   12uW     REG             252,17    12582912   14155787 /data/mysql/data/ibtmp1 (deleted)
mysqld     272718                              mysql   14uW     REG             252,17    16777216   14155788 /data/mysql/data/undo_001 (deleted)
mysqld     272718                              mysql   15uW     REG             252,17    16777216   14155792 /data/mysql/data/undo_002 (deleted)
mysqld     272718                              mysql   23uW     REG             252,17  4315938816   14156109 /data/mysql/data/mydb/table_1.ibd (deleted)
mysqld     272718                              mysql   30uW     REG             252,17      114688   14155959 /data/mysql/data/mydb/table_2.ibd (deleted)
mysqld     272718                              mysql   31uW     REG             252,17    22020096   14156111 /data/mysql/data/mydb/table_3.ibd (deleted)
mysqld     272718                              mysql   32uW     REG             252,17    27262976   14156171 /data/mysql/data/mydb/table_4.ibd (deleted)</pre>
<p>　　2、查找进程文件描述符目录内容。</p>
<p>　　上面的第二列 272718 就是MySQL服务的进程ID，接下来找到进程对应的文件操作描述符目录 /proc/272718/fd，看一下内容：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">root@mysql-server:~# cd /proc/272718/fd
root@mysql-server:/proc/272718/fd# ll
dr-x------ 2 mysql mysql 256 Nov  1  2023 ./
dr-xr-xr-x 9 mysql mysql   0 Nov  1  2023 ../
lr-x------ 1 mysql mysql  64 Mar 12 17:35 0 -&gt; /dev/null
l-wx------ 1 mysql mysql  64 Mar 12 17:35 1 -&gt; '/var/log/mysql/error.log.1 (deleted)'
lrwx------ 1 mysql mysql  64 Mar 12 17:35 10 -&gt; '/data/mysql/data/ibdata1 (deleted)'
lrwx------ 1 mysql mysql  64 Mar 12 17:35 106 -&gt; '/data/mysql/data/mydb/table_1.ibd (deleted)'
lrwx------ 1 mysql mysql  64 Mar 12 17:35 118 -&gt; '/data/mysql/data/mydb/table_3.ibd (deleted)'</pre>
<p>　　可以直接使用 cat 这些描述符来确定文件内容是否还在。</p>
<p>　　3、使用IO重定向进行恢复。</p>
<p>　　将文件恢复到本地，<span style="color: #e03e2d;"><strong>这里切勿和被恢复的文件放到相同的分区！！</strong></span></p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;"># cat /proc/272718/fd/118 &gt; /recovery/data/mysql/data/mydb/table_3.ibd</pre>
<p>　　或者将数据流传输至其他服务器进行保存。</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;"># cat /proc/272718/fd/118 | ssh 192.41.6.5 'cat &gt; /data/recovery/data/mysql/data/mydb/table_3.ibd'</pre>
<p>　　如果文件较多，可以结合awk sed或者记事本进行批量处理生成需要执行的重定向命令。</p>
<p>二、数据库恢复</p>
<p>　　要将恢复回来的ibd文件导入到新库上，要求新库的数据库表结构<span style="color: #e03e2d;"><strong>必须</strong></span>与ibd内的数据使用的表结构相同，否则是无法使用导入ibd的方式恢复（后面会讲怎么处理）。</p>
<p>　　1、创建并导入初始化用的数据库。</p>
<p>　　2、导入ibd数据</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">-- 禁用外键约束检查
SET FOREIGN_KEY_CHECKS = 0;

-- 丢弃指定表的表空间
ALTER TABLE table_1 DISCARD TABLESPACE;
ALTER TABLE table_2 DISCARD TABLESPACE;
ALTER TABLE table_3 DISCARD TABLESPACE;

-- 将恢复回来的ibd文件拷贝到对应的数据库下面，然后进行导入，过程中不需要重启数据库服务

-- 导入表空间
ALTER TABLE table_1 IMPORT TABLESPACE;
ALTER TABLE table_2 IMPORT TABLESPACE;
ALTER TABLE table_3 IMPORT TABLESPACE;

-- 全部导入成功后重新启用外键约束检查
SET FOREIGN_KEY_CHECKS = 1;</pre>
<p>　　3、处理无法导入的ibd</p>
<p>　　我遇到了4个表因为表结构问题致使无法导入ibd文件。接下来可以使用一个名为 <a href="https://github.com/ddcw/ibd2sql" target="_blank" rel="nofollow noopener"><span class="AppHeader-context-item-label  ">ibd2sql</span></a> 的开源工具，它可以从ibd文件中解析出sql语句。</p>
<p>　　该脚本基于Python编写，可以从ibd文件中解析出sql语句，不需要安装第三方库，使用方法如下：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;"># wget https://github.com/ddcw/ibd2sql/archive/refs/tags/v1.9.tar.gz
# tar -zxvf ibd2sql-1.9.tar.gz
# cd ibd2sql-*
# cp /recovery/data/mysql/data/mydb/table_7.ibd .
# python3 main.py ./table_7.ibd --sql --ddl &gt; table_7.sql</pre>
<p>　　接下来将生成的sql文件在目标数据库上执行，最后将整个恢复完的数据库导入到目标环境进行测试验证即可。</p>
<p>　　<em><span style="color: #7e8c8d;">脚本 Release Notes 里介绍的是解析 MySQL 5.7 的ibd文件，但是我用在MySQL 8.0.xx的ibd文件上也可以顺利解析，可能是由于这几个表数据不复杂吧。</span></em></p>
<p><strong>最后：</strong></p>
<p>　　１、误删除文件切勿慌张，如果还存在访问该文件的进程，抓紧利用IO重定向的方法将数据备份出来；</p>
<p>　　2、做好每日备份，如果是云主机最好也要开快照；</p>
<p>　　3、执行rm操作时需格外谨慎，尽量避免使用rm -rf * 这样危险的命令；</p>
<p>　　4、感谢 <a href="https://github.com/ddcw/ibd2sql" target="_blank" rel="nofollow noopener"><span class="AppHeader-context-item-label  ">ibd2sql</span></a> 工具作者。</p>
<p><span>　　<span style="color: #e03e2d;"><strong>注：本次恢复成功存在较大偶然性，实际生产环境应建立多重数据保护机制，切勿依赖事后恢复。</strong></span></span></p>
<p style="text-align: right;"><strong>本文结束。</strong><strong></strong></p>]]>
    </content>
</entry>

<entry>
    <title>SQL Server数据库文件的还原与优化</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2016/01/quninfo.html" />
    <id>tag:www.sothink.cn,2016://1.135</id>

    <published>2016-01-13T08:00:08Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 这数据库的文件解压后有几十个GB，分成十几个库，我是参考知乎用户的回帖中介绍的步骤一步一步做下来的，其中有几处错误做了改正。 由于这些mdf是从SQL Server 2000上创建的，想要直接附加它们，最高可以使用SQL Server 2008 R2，如果想在SQL Server 2012或更高版本的SQL Server上使用，请参考这里的操作，我这里使用的是SQL Server 2012。 在操作过程中，请根据实际情况修改：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　这数据库的文件解压后有几十个GB，分成十几个库，我是参考<a href="https://www.zhihu.com/question/50751728" rel="nofollow noopener" target="_blank">知乎用户</a>的回帖中介绍的步骤一步一步做下来的，其中有几处错误做了改正。</p>
<p>　　由于这些mdf是从SQL Server 2000上创建的，想要直接附加它们，最高可以使用SQL Server 2008 R2，如果想在SQL Server 2012或更高版本的SQL Server上使用，请参考<a href="https://www.sothink.cn/archives/2015/12/sql-Server-database-xx-cannot-be-upgraded-because-its-non-release-version-539.html" title="此版本的 SQL Server 不支持该数据库的非发布版本(539)" target="_self">这里</a>的操作，我这里使用的是SQL Server 2012。</p>
<p>　　在操作过程中，请根据实际情况修改：</p>]]>
        <![CDATA[<p>一、附加数据库</p>
<p>　　由于没有日志文件，所以采用执行SQL语句的形式附加进数据库（注意QunInfo01~QunInfo11的命名不要改）。打开Microsoft SQL Server Management Studio，菜单栏右上角找到“新建查询按钮”，打执行下面的语句：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--附加数据库(MDF文件路径可根据需要修改)
sp_attach_single_file_db @dbname= 'GroupData01',@physname= 'D:\数据库\GroupData1_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData02',@physname= 'D:\数据库\GroupData2_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData03',@physname= 'D:\数据库\GroupData3_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData04',@physname= 'D:\数据库\GroupData4_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData05',@physname= 'D:\数据库\GroupData5_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData06',@physname= 'D:\数据库\GroupData6_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData07',@physname= 'D:\数据库\GroupData7_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData08',@physname= 'D:\数据库\GroupData8_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData09',@physname= 'D:\数据库\GroupData9_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData10',@physname= 'D:\数据库\GroupData10_Data.MDF'
go
sp_attach_single_file_db @dbname= 'GroupData11',@physname= 'D:\数据库\GroupData11_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo01',@physname= 'D:\数据库\QunInfo1_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo02',@physname= 'D:\数据库\QunInfo2_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo03',@physname= 'D:\数据库\QunInfo3_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo04',@physname= 'D:\数据库\QunInfo4_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo05',@physname= 'D:\数据库\QunInfo5_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo06',@physname= 'D:\数据库\QunInfo6_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo07',@physname= 'D:\数据库\QunInfo7_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo08',@physname= 'D:\数据库\QunInfo8_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo09',@physname= 'D:\数据库\QunInfo9_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo10',@physname= 'D:\数据库\QunInfo10_Data.MDF'
go
sp_attach_single_file_db @dbname= 'QunInfo11',@physname= 'D:\数据库\QunInfo11_Data.MDF'
go</pre>
<p>　　这样，得到了22个数据库，上千张表，查询耗时长，效率低，需要做进一步优化。</p>
<p>二、合并数据库</p>
<p>　　把QunInfo01~11、GroupData01~11分别合并到两个库QunInfo、GroupData，然后使用分区表提升性能。步骤如下：</p>
<p>1、创建新的库用于合并</p>
<p>　　创建一个名为QunInfo的数据库，设置数据库为简单恢复模式。mdf、ldf文件保存路径根据需要更改，脚本如下：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">USE [master]
GO
CREATE DATABASE [QunInfo] ON  PRIMARY 
( NAME = N'QunInfo', FILENAME = N'D:\DATA\QunInfo.mdf' , SIZE = <span style="color: #ff0000;">5120</span>KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'QunInfo_log', FILENAME = N'D:\DATA\QunInfo_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [QunInfo] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [QunInfo].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [QunInfo] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [QunInfo] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [QunInfo] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [QunInfo] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [QunInfo] SET ARITHABORT OFF 
GO

ALTER DATABASE [QunInfo] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [QunInfo] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [QunInfo] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [QunInfo] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [QunInfo] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [QunInfo] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [QunInfo] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [QunInfo] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [QunInfo] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [QunInfo] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [QunInfo] SET  DISABLE_BROKER 
GO

ALTER DATABASE [QunInfo] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [QunInfo] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [QunInfo] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [QunInfo] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [QunInfo] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [QunInfo] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [QunInfo] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [QunInfo] SET  READ_WRITE 
GO

ALTER DATABASE [QunInfo] SET RECOVERY SIMPLE 
GO

ALTER DATABASE [QunInfo] SET  MULTI_USER 
GO

ALTER DATABASE [QunInfo] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [QunInfo] SET DB_CHAINING OFF 
GO</pre>
<p>　　创建一个名为GroupData的数据库，配置同上：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">USE [master]
GO
CREATE DATABASE [GroupData] ON  PRIMARY 
( NAME = N'GroupData', FILENAME = N'D:\DATA\GroupData.mdf' , SIZE = <span style="color: #ff0000;">5120</span>KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'GroupData_log', FILENAME = N'D:\DATA\GroupData_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [GroupData] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [GroupData].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [GroupData] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [GroupData] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [GroupData] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [GroupData] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [GroupData] SET ARITHABORT OFF 
GO

ALTER DATABASE [GroupData] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [GroupData] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [GroupData] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [GroupData] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [GroupData] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [GroupData] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [GroupData] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [GroupData] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [GroupData] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [GroupData] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [GroupData] SET  DISABLE_BROKER 
GO

ALTER DATABASE [GroupData] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [GroupData] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [GroupData] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [GroupData] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [GroupData] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [GroupData] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [GroupData] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [GroupData] SET  READ_WRITE 
GO

ALTER DATABASE [GroupData] SET RECOVERY SIMPLE 
GO

ALTER DATABASE [GroupData] SET  MULTI_USER 
GO

ALTER DATABASE [GroupData] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [GroupData] SET DB_CHAINING OFF 
GO</pre>
<p>2、统一表名</p>
<p>　　修改各个数据库中表的名字：把QunList1统一修改为QunList01这样格式的，这样做的好处就是在合并数据的时候读取到的数据库的数据是按照顺序插入到表中的，不会造成数据页的拆分。</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--格式化表名
USE QunInfo01
GO
exec sp_rename 'QunList1','QunList01'
exec sp_rename 'QunList2','QunList02'
exec sp_rename 'QunList3','QunList03'
exec sp_rename 'QunList4','QunList04'
exec sp_rename 'QunList5','QunList05'
exec sp_rename 'QunList6','QunList06'
exec sp_rename 'QunList7','QunList07'
exec sp_rename 'QunList8','QunList08'
exec sp_rename 'QunList9','QunList09'

USE GroupData01
GO
exec sp_rename 'Group1','Group01'
exec sp_rename 'Group2','Group02'
exec sp_rename 'Group3','Group03'
exec sp_rename 'Group4','Group04'
exec sp_rename 'Group5','Group05'
exec sp_rename 'Group6','Group06'
exec sp_rename 'Group7','Group07'
exec sp_rename 'Group8','Group08'
exec sp_rename 'Group9','Group09'</pre>
<p>3、创建临时表</p>
<p>　　在QunInfo、GroupData数据库中分别创建一个临时表：tables，用来保存所有的数据库与表的信息，提供数据库合并用。</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--创建临时表
use [QunInfo]
CREATE TABLE [QunInfo].[dbo].[tables](
    [db_name] [sysname] NULL,
    [table_name] [sysname] NULL,
    [status] [bit] default 0
) ON [PRIMARY]

--生成数据库名称与表名称的对应列表
EXEC sp_MSForEachDB 'USE [?];
    --插入表信息
    INSERT INTO [QunInfo].[dbo].[tables]([table_name])
        SELECT name from [?].sys.tables where name like ''QunList%'' order by name
    --更新数据库名称
    UPDATE [QunInfo].[dbo].[tables] SET [db_name] = ''?'' WHERE [db_name] is NULL'

use [GroupData]
--创建临时表
CREATE TABLE [GroupData].[dbo].[tables](
    [db_name] [sysname] NULL,
    [table_name] [sysname] NULL,
    [status] [bit] default 0
) ON [PRIMARY]

--生成数据库名称与表名称的对应列表
EXEC sp_MSForEachDB 'USE [?];
    --插入表信息
    INSERT INTO [GroupData].[dbo].[tables]([table_name])
        SELECT name from [?].sys.tables where name like ''Group%'' order by name
    --更新数据库名称
    UPDATE [GroupData].[dbo].[tables] SET [db_name] = ''?'' WHERE [db_name] IS NULL'</pre>
<p>4、表分区</p>
<p>　　对大数据表分区可以加快查询速度。经过估算，QunInfo表格数据加起来近9千万行。查询的时候大多用群号字段，所以用这个群号的字段[QunNum]作为分区，每一千万做一个分区，最大的群号为100219998，这样就有11个分区。以下是分区脚本：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">USE [QunInfo]
GO

--1.创建文件组
ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_01]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_02]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_03]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_04]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_05]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_06]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_07]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_08]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_09]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_10]

ALTER DATABASE [QunInfo]
ADD FILEGROUP [FG_QunList_QunNum_11]


--2.创建文件
ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_01_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_01_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_01];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_02_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_02_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_02];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_03_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_03_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_03];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_04_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_04_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_04];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_05_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_05_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_05];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_06_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_06_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_06];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_07_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_07_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_07];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_08_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_08_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_08];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_09_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_09_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_09];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_10_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_10_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_10];

ALTER DATABASE [QunInfo]
ADD FILE
(NAME = N'FG_QunList_QunNum_11_data',FILENAME = N'D:\数据库\FG_QunList_QunNum_11_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_QunList_QunNum_11];


--3.创建分区函数
CREATE PARTITION FUNCTION
[Fun_QunList_QunNum](INT) AS
RANGE RIGHT
FOR VALUES(10000000,20000000,30000000,40000000,50000000,60000000,70000000,80000000,90000000,100000000)


--4.创建分区方案
CREATE PARTITION SCHEME
[Sch_QunList_QunNum] AS
PARTITION [Fun_QunList_QunNum]
TO([FG_QunList_QunNum_01],[FG_QunList_QunNum_02],[FG_QunList_QunNum_03],[FG_QunList_QunNum_04],[FG_QunList_QunNum_05],[FG_QunList_QunNum_06],[FG_QunList_QunNum_07],[FG_QunList_QunNum_08],[FG_QunList_QunNum_09],[FG_QunList_QunNum_10],[FG_QunList_QunNum_11])


--5.分区函数的记录数
SELECT $PARTITION.[Fun_QunList_QunNum](QunNum) AS Partition_num,
  MIN(QunNum) AS Min_value,MAX(QunNum) AS Max_value,COUNT(1) AS Record_num
FROM dbo.[QunList]
GROUP BY $PARTITION.[Fun_QunList_QunNum](QunNum)
ORDER BY $PARTITION.[Fun_QunList_QunNum](QunNum);</pre>
<p>　　GroupData里面的数据大概有15亿，以群号作为分区依据，每五百万为一组，可分为21个文件组：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">USE [GroupData]
GO

--1.创建文件组
ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_01]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_02]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_03]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_04]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_05]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_06]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_07]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_08]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_09]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_10]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_11]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_12]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_13]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_14]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_15]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_16]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_17]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_18]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_19]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_20]

ALTER DATABASE [GroupData]
ADD FILEGROUP [FG_Group_QunNum_21]


--2.创建文件
ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_01_data',FILENAME = N'D:\数据库\FG_Group_QunNum_01_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_01];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_02_data',FILENAME = N'D:\数据库\FG_Group_QunNum_02_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_02];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_03_data',FILENAME = N'D:\数据库\FG_Group_QunNum_03_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_03];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_04_data',FILENAME = N'D:\数据库\FG_Group_QunNum_04_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_04];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_05_data',FILENAME = N'D:\数据库\FG_Group_QunNum_05_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_05];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_06_data',FILENAME = N'D:\数据库\FG_Group_QunNum_06_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_06];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_07_data',FILENAME = N'D:\数据库\FG_Group_QunNum_07_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_07];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_08_data',FILENAME = N'D:\数据库\FG_Group_QunNum_08_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_08];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_09_data',FILENAME = N'D:\数据库\FG_Group_QunNum_09_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_09];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_10_data',FILENAME = N'D:\数据库\FG_Group_QunNum_10_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_10];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_11_data',FILENAME = N'D:\数据库\FG_Group_QunNum_11_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_11];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_12_data',FILENAME = N'D:\数据库\FG_Group_QunNum_12_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_12];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_13_data',FILENAME = N'D:\数据库\FG_Group_QunNum_13_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_13];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_14_data',FILENAME = N'D:\数据库\FG_Group_QunNum_14_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_14];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_15_data',FILENAME = N'D:\数据库\FG_Group_QunNum_15_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_15];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_16_data',FILENAME = N'D:\数据库\FG_Group_QunNum_16_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_16];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_17_data',FILENAME = N'D:\数据库\FG_Group_QunNum_17_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_17];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_18_data',FILENAME = N'D:\数据库\FG_Group_QunNum_18_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_18];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_19_data',FILENAME = N'D:\数据库\FG_Group_QunNum_19_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_19];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_20_data',FILENAME = N'D:\数据库\FG_Group_QunNum_20_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_20];

ALTER DATABASE [GroupData]
ADD FILE
(NAME = N'FG_Group_QunNum_21_data',FILENAME = N'D:\数据库\FG_Group_QunNum_21_data.ndf',SIZE = 100MB, FILEGROWTH = 10MB )
TO FILEGROUP [FG_Group_QunNum_21];


--3.创建分区函数
CREATE PARTITION FUNCTION
[Fun_Group_QunNum](INT) AS
RANGE RIGHT
FOR VALUES(5000000,10000000,15000000,20000000,25000000,30000000,35000000,40000000,45000000,50000000,55000000,60000000,65000000,70000000,75000000,80000000,85000000,90000000,95000000,100000000)


--4.创建分区方案
CREATE PARTITION SCHEME
[Sch_Group_QunNum] AS
PARTITION [Fun_Group_QunNum]
TO([FG_Group_QunNum_01],[FG_Group_QunNum_02],[FG_Group_QunNum_03],[FG_Group_QunNum_04],[FG_Group_QunNum_05],[FG_Group_QunNum_06],[FG_Group_QunNum_07],[FG_Group_QunNum_08],[FG_Group_QunNum_09],[FG_Group_QunNum_10],[FG_Group_QunNum_11],[FG_Group_QunNum_12],[FG_Group_QunNum_13],[FG_Group_QunNum_14],[FG_Group_QunNum_15],[FG_Group_QunNum_16],[FG_Group_QunNum_17],[FG_Group_QunNum_18],[FG_Group_QunNum_19],[FG_Group_QunNum_20],[FG_Group_QunNum_21])


--5.分区函数的记录数
SELECT $PARTITION.[Fun_Group_QunNum](QunNum) AS Partition_num,
  MIN(QunNum) AS Min_value,MAX(QunNum) AS Max_value,COUNT(1) AS Record_num
FROM dbo.[Group]
GROUP BY $PARTITION.[Fun_Group_QunNum](QunNum)
ORDER BY $PARTITION.[Fun_Group_QunNum](QunNum);
</pre>
<p>5、新建数据表</p>
<p>　　在数据库[QunInfo]新建一个QunList表用于合并QunInfo01~11的所有表格，涉及内容如下：</p>
<p style="padding-left: 40px;">1) 在QunInfo数据库中创建分区表QunList，去掉没有太大意义的ID字段；<br />2) 以[QunNum]作为聚集索引，而且是唯一的，这个需要开启IGNORE_DUP_KEY = ON选项，这样才可以在批量插入的时候忽略重复值；<br />3) 对原表的[MastQQ]字段从int类型变成smallint，[CreateDate]字段从varchar(10)类型变为date，数据类型修改是为了减少表占用的空间；<br />4) 使用刚刚创建好的分区方案，之后创建的索引进行索引对齐；<br />5) 对表使用行压缩，减少数据库占用空间。</p>
<p style="padding-left: 40px;">脚本如下：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--创建优化后的QunList表
use [QunInfo]
CREATE TABLE [dbo].[QunList](
    [QunNum] [int] NOT NULL,
    [MastQQ] [smallint] NULL,
    [CreateDate] [date] NULL,
    [Title] [varchar](22) NULL,
    [Class] [varchar](38) NULL,
    [QunText] [varchar](80) NULL,
 CONSTRAINT [PK_QunList2] PRIMARY KEY CLUSTERED 
(
    [QunNum] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, DATA_COMPRESSION = ROW) ON [Sch_QunList_QunNum]([QunNum])
) ON [Sch_QunList_QunNum]([QunNum])
GO</pre>
<p>　　同理对GroupData进行同样的操作，新建一个Group表：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">use GroupData
CREATE TABLE [dbo].[Group](
    [QunNum] [int] NOT NULL,
    [QQNum] [int] NOT NULL,
    [Nick] [varchar](20) NULL,
    [Age] [tinyint] NULL,
    [Gender] [tinyint] NULL,
    [Auth] [tinyint] NULL,
 CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED 
(
    [QunNum] ASC,
    [QQNum] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, DATA_COMPRESSION = ROW) ON [Sch_Group_QunNum]([QunNum])
) ON [Sch_Group_QunNum]([QunNum])
GO
</pre>
<p>6、数据表合并</p>
<p>　　把11个数据库都合并到新创建的QunInfo的QunList表中（根据电脑性能，大概要跑一两个小时。<span style="color: #888888;">参考：E5-2640 16核心15分钟</span>）：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--合并数据
DECLARE @tablename sysname
DECLARE @dbname sysname
DECLARE @sql NVARCHAR(max)

--游标
DECLARE @itemCur CURSOR
SET @itemCur = CURSOR FOR 
    SELECT db_name,table_name from [QunInfo].[dbo].[tables]

OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @dbname,@tablename
WHILE @@FETCH_STATUS=0

BEGIN
    
    SET @sql = '
    INSERT INTO [QunInfo].[dbo].[QunList]
           ([QunNum]
           ,[MastQQ]
           ,[CreateDate]
           ,[Title]
           ,[Class]
           ,[QunText])
    SELECT [QunNum]
      ,[MastQQ]
      ,[CreateDate]
      ,[Title]
      ,[Class]
      ,[QunText]
    FROM ['+@dbname+'].[dbo].['+@tablename+']'
  
    EXEC(@sql)
    
    UPDATE [QunInfo].[dbo].[tables] SET status = 1 WHERE db_name = @dbname AND table_name = @tablename
    
    --返回SQL
    PRINT(@sql)PRINT('GO')+CHAR(13)

    FETCH NEXT FROM @itemCur INTO @dbname,@tablename
END 

CLOSE @itemCur
DEALLOCATE @itemCur


--运行插入脚本时，可以查看进度
SELECT * from [QunInfo].[dbo].[tables]</pre>
<p>　　把GroupData01~11里的数据合并到GroupData库里的Group表（大概跑几个小时。<span style="color: #888888;">参考：E5-2640 16核心6小时左右</span>）：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--合并数据
DECLARE @tablename sysname
DECLARE @dbname sysname
DECLARE @sql NVARCHAR(max)

--游标
DECLARE @itemCur CURSOR
SET @itemCur = CURSOR FOR 
    SELECT db_name,table_name from [GroupData].[dbo].[tables]

OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @dbname,@tablename
WHILE @@FETCH_STATUS=0

BEGIN
    
    SET @sql = '
INSERT INTO [GroupData].[dbo].[Group]
           ([QunNum]
           ,[QQNum]
           ,[Nick]
           ,[Age]
           ,[Gender]
           ,[Auth])
    SELECT [QunNum]
           ,[QQNum]
           ,[Nick]
           ,[Age]
           ,[Gender]
           ,[Auth]
    FROM ['+@dbname+'].[dbo].['+@tablename+']'
  
    EXEC(@sql)
    
    UPDATE [GroupData].[dbo].[tables] SET status = 1 WHERE db_name = @dbname AND table_name = @tablename
    
    --返回SQL
    PRINT(@sql)PRINT('GO')+CHAR(13)

    FETCH NEXT FROM @itemCur INTO @dbname,@tablename
END 

CLOSE @itemCur
DEALLOCATE @itemCur</pre>
<p>7、建立索引</p>
<p>　　为GroupData的Group表里的QQnum新建一个索引并对索引进行行压缩：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--索引行压缩
USE [GroupData]
GO
CREATE NONCLUSTERED INDEX [IX_Group_QQNum] ON [dbo].[Group] 
(
    [QQNum] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, DATA_COMPRESSION = ROW) ON [Sch_Group_QunNum]([QunNum])
GO
</pre>
<p>8、页压缩：</p>
<p>　　对QunInfo进行页压缩：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--索引页压缩
USE [QunInfo]
GO
ALTER TABLE [QunList]  
REBUILD WITH (DATA_COMPRESSION = PAGE );</pre>
<p>　　对GroupData进行页压缩：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">--20260709 修正对GroupData进行页压缩方法，感谢评论区热心网友指正<br /><br />--索引页压缩
USE [GroupData]
GO
<br />--聚集索引，存储真正的数据页<br />ALTER INDEX [PK_Group]
ON [dbo].[Group]
REBUILD
WITH
(
    DATA_COMPRESSION = PAGE
);<br />
--非聚集索引，存储索引页<br />ALTER INDEX [IX_Group_QQNum]
ON [dbo].[Group]
REBUILD
WITH
(
    DATA_COMPRESSION = PAGE
);

GO
</pre>
<p>9、查看压缩结果：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">Use [QunInfo] 
EXEC sp_spaceused [QunList]  
Use [GroupData] 
EXEC sp_spaceused <span style="color: #ff0000;">[Group]  </span></pre>
<p>　　看看每个分区的数据：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">SELECT 
    partition = $PARTITION.Fun_QunList_QunNum([QunNum])
    ,rows      = COUNT(*)
    ,min    = MIN([QunNum])
    ,max    = MAX([QunNum])
FROM [dbo].[QunList]
GROUP BY $PARTITION.Fun_QunList_QunNum([QunNum])
ORDER BY PARTITION</pre>
<p>10、存储过程</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Qun]    
   (    
       @QunNum int
     )    
    AS    
SELECT  a.[QunNum]
      ,[QQNum]
      ,[Nick]
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[Title]
      ,[Class]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  a.[QunNum]=@QunNum order by [Auth] desc
GO

use QunInfo
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Qun]    
   (    
       @QunNum int
     )    
    AS    
SELECT  a.[QunNum]
      ,[QQNum]
      ,[Nick]
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[Title]
      ,[Class]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  a.[QunNum]=@QunNum order by [Auth] desc
GO

use GroupData
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Qun]    
   (    
       @QunNum int
     )    
    AS    
SELECT  a.[QunNum]
      ,[QQNum]
      ,[Nick]
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[Title]
      ,[Class]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  a.[QunNum]=@QunNum order by [Auth] desc
GO
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[QQ]    
   (    
       @QQNum int
     )    
    AS    
SELECT  a.[QunNum] 群号码
	  ,[Title] 群名
      ,[QQNum] QQ号码
      ,[Nick] 昵称
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  [QQNum]=@QQNum order by CreateDate
GO
USE [QunInfo]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[QQ]    
   (    
       @QQNum int
     )    
    AS    
SELECT  a.[QunNum] 群号码
	  ,[Title] 群名
      ,[QQNum] QQ号码
      ,[Nick] 昵称
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  [QQNum]=@QQNum order by CreateDate
GO
USE GroupData
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[QQ]    
   (    
       @QQNum int
     )    
    AS    
SELECT  a.[QunNum] 群号码
	  ,[Title] 群名
      ,[QQNum] QQ号码
      ,[Nick] 昵称
      ,[Age]
      ,(case when [Gender]=0 then '男' else '女' end) 性别
      ,(case when [Auth]=1 then '成员' when [Auth]=4 then '群主' when [Auth]=2 then '管理' end) 身份
      ,[MastQQ]
      ,[CreateDate]
      ,[QunText]
  FROM [GroupData].[dbo].[Group] a
  left join [QunInfo].[dbo].[QunList] b
  on a.[QunNum]=b.QunNum
  where  [QQNum]=@QQNum order by CreateDate
GO</pre>
<p>　　创建完存储过程之后，查询起来就很方便了：exec dbo.Qun [群号码] 或者exec dbo.QQ [QQ号码]。</p>
<p>　　最后可以删除QunInfo01~11、GroupData01~11这22个库了，只留下QunInfo库和GroupData库。</p>
<p>　　感谢原文作者提供这么详尽的使用方法。</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>此版本的 SQL Server 不支持该数据库的非发布版本(539)</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/12/sql-Server-database-xx-cannot-be-upgraded-because-its-non-release-version-539.html" />
    <id>tag:www.sothink.cn,2015://1.134</id>

    <published>2015-12-23T02:30:17Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 在尝试使用SQL Server 2012附加数据库时发生下面的错误： 消息 1813，级别 16，状态 2，第 1 行 无法打开新数据库 &apos;XxxData01&apos;。CREATE DATABASE 中止。 消息 950，级别 20，状态 1，第 1 行 无法升级数据库 &apos;XxxData01&apos;，因为此版本的 SQL Server 不支持该数据库的非发布版本(539)。不能打开与此版本的 sqlservr.exe 不兼容的数据库。必须重新创建该数据库。...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Windows" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　在尝试使用SQL Server 2012附加数据库时发生下面的错误：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">消息 1813，级别 16，状态 2，第 1 行
无法打开新数据库 'XxxData01'。CREATE DATABASE 中止。
消息 950，级别 20，状态 1，第 1 行
无法升级数据库 'XxxData01'，因为此版本的 SQL Server 不支持该数据库的非发布版本(539)。不能打开与此版本的 sqlservr.exe 不兼容的数据库。必须重新创建该数据库。
</pre>
<p></p>]]>
        <![CDATA[<p>　　经过搜索后才知道：539 是SQL Server 2000 数据库的内部版本号，也就是说要附加的数据库文件是SQL Server 2000 创建的，但是SQL Server 2012 数据库已经不再兼容SQL Server 2000 数据库了。SQL Server 2012 最低只支持到SQL Server 2005，可以打开一个已有的数据库的属性，在“选项"里面的兼容级别里看到。</p>
<p>　　所以如果想在SQL Server 2012上附加这个SQL Server 2000 创建的数据库文件，则需要先将该数据库附加到SQL Server 2005或者SQL Server 2008上，然后分离该数据库才能再在 SQL Server 2012上附加。</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>error while loading shared libraries: libz.so.1</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/12/error-while-loading-shared-libraries-libz-so-1.html" />
    <id>tag:www.sothink.cn,2015://1.133</id>

    <published>2015-12-15T05:24:51Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 在尝试编译Asus-Merlin源码时遇到的这个错误： arm-brcm-linux-uclibcgnueabi/bin/as: error while loading shared libraries: libz.so.1 我使用的是Ubuntu 16.04，可以通过apt-file来查找这个动态链接库文件属于哪个包：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　在尝试编译Asus-Merlin源码时遇到的这个错误：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;">arm-brcm-linux-uclibcgnueabi/bin/as: error while loading shared libraries: libz.so.1</pre>
<p>　　我使用的是Ubuntu 16.04，可以通过<span>apt-file来查找这个动态链接库文件属于哪个包：</span></p>
<p></p>]]>
        <![CDATA[<p></p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;"> $ sudo apt-get install apt-file
 $ sudo apt-file update
 $ apt-file search libz.so.1
 lib32z1: /usr/lib32/libz.so.1
 lib32z1: /usr/lib32/libz.so.1.2.8
 libx32z1: /usr/libx32/libz.so.1
 libx32z1: /usr/libx32/libz.so.1.2.8
 zlib1g: /lib/x86_64-linux-gnu/libz.so.1
 zlib1g: /lib/x86_64-linux-gnu/libz.so.1.2.8
 $ sudo apt-get install lib32z1
</pre>
<p>　　安装好lib32z1后就可以正常编译Asus-Merlin的源码了。如果使用的是系统是使用yum作为包管理器的，可以使用下面的吗命令查看这个文件属于哪个包，然后选择其中一个安装即可：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding-top: 12px; padding-right: 12px; padding-bottom: 12px; vertical-align: baseline; overflow: auto; border-radius: 4px; color: #333333; margin-left: 42px;"> # yum whatprovides */libz.so.1
 zlib-1.2.3-29.el6.x86_64 : The zlib compression and decompression library
 Repo        : base
 Matched from:
 Filename    : /lib64/libz.so.1<br />
 zlib-1.2.3-29.el6.i686 : The zlib compression and decompression library
 Repo        : base
 Matched from:
 Filename    : /lib/libz.so.1

 zlib-1.2.3-29.el6.x86_64 : The zlib compression and decompression library
 Repo        : installed
 Matched from:
 Filename    : /lib64/libz.so.1
</pre>
<p style="text-align: right;"><strong></strong></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>Kettle Spoon界面乱码</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/12/kettle-spoon-chinese-support.html" />
    <id>tag:www.sothink.cn,2015://1.132</id>

    <published>2015-12-12T05:14:55Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> Kettle Spoon提供了中文支持，如果系统使用最小化安装的话，界面切换到中文时就可能会遇到界面乱码的问题。记录一下在RHEL 6.x下的解决方法： yum -y install &quot;Chinese Support&quot;...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　Kettle Spoon提供了中文支持，如果系统使用最小化安装的话，界面切换到中文时就可能会遇到界面乱码的问题。记录一下在RHEL 6.x下的解决方法：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">yum -y install "Chinese Support"</pre>]]>
        <![CDATA[<p>　　安装完"Chinese Support"包后可能会遇到<a href="https://www.sothink.cn/archives/2015/12/d-bus-library-appears-to-be-incorrectly-set-up.html">D-Bus library appears to be incorrectly set up</a>的问题，然后直接启动Spoon中文就不会乱码了。</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">dbus-uuidgen &gt;/var/lib/dbus/machine-id</pre>
<p>　　不需设置LC_ALL环境变量为zh_CN.xxxx，也不用去修改jdk的配置文件。</p>
<p>　　我的Java环境变量设置参数：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">JAVA_HOME=/opt/jdk1.8
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH</pre>
<p>　　与LANG相关的配置为：en_US.UTF-8，这样终端显示还是英文，软件界面即使是中文也不会乱码。</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>D-Bus library appears to be incorrectly set up</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/12/d-bus-library-appears-to-be-incorrectly-set-up.html" />
    <id>tag:www.sothink.cn,2015://1.131</id>

    <published>2015-12-04T09:04:06Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 很诡异的问题，刚刚软件还能正常的执行，装了“Chinese Support”包之后，软件就报错了： [root@vm-18-174 data-integration]# ./spoon.sh Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 process 25734: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open &quot;/var/lib/dbus/machine-id&quot;: No...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="窗外" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　很诡异的问题，刚刚软件还能正常的执行，装了“Chinese Support”包之后，软件就报错了：</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">[root@vm-18-174 data-integration]# ./spoon.sh 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
process 25734: <a href="https://www.sothink.cn/archives/2015/12/d-bus-library-appears-to-be-incorrectly-set-up.html">D-Bus library appears to be incorrectly set up</a>; <a href="https://www.sothink.cn/archives/2015/12/d-bus-library-appears-to-be-incorrectly-set-up.html">failed to read machine uuid</a>: <a href="https://www.sothink.cn/archives/2015/12/d-bus-library-appears-to-be-incorrectly-set-up.html">Failed to open "/var/lib/dbus/machine-id"</a>: No such file or directory
See the manual page for dbus-uuidgen to correct this issue.
  D-Bus not built with -rdynamic so unable to print a backtrace
./spoon.sh: line 229: 25734 Aborted                 "$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}" 2&gt;&amp;1</pre>]]>
        <![CDATA[<p>　　重新看了一下随“Chinese Support”包安装的有个dbus-x11软件包，或许是因为安装了它吧。</p>
<p>　　解决方法：使用dbus-uuidgen命令重新生成一个UUID就好了。</p>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">dbus-uuidgen &gt;/var/lib/dbus/machine-id</pre>
<p></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>RHEL: Can&apos;t open display:</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/11/rhel-cant-open-display.html" />
    <id>tag:www.sothink.cn,2015://1.130</id>

    <published>2015-11-26T06:07:15Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 一个全新安装的RHEL6.x的系统，尝试使用GUI程序时报错：Can&apos;t open display:。折腾了一整天，发现是最小化安装缺少xorg-x11-xauth包导致的。 解决方法：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="窗外" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="centos" label="CentOS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　一个全新安装的RHEL6.x的系统，尝试使用GUI程序时报错：<a href="https://www.sothink.cn/archives/2015/11/rhel-cant-open-display.html" title="xterm Xt error: Can't open display: localhost:10.0">Can't open display:</a>。折腾了一整天，发现是最小化安装缺少xorg-x11-xauth包导致的。</p>
<p>　　解决方法：</p>]]>
        <![CDATA[<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">yum -y install xorg-x11-xauth</pre>
</blockquote>
<p>　　然后确认在sshd_config中X11Forwarding为yes，重新登录终端时提示的Xauthority does not exist忽略即可。</p>
<p style="text-align: center;"><img src="https://lh3.googleusercontent.com/lMor7375HghSC5WhEIRH1wKVV20fEUo8Ww4NJbWomynH3n0ihQvMCmnOfRIBHNlQOu-HZ1KOxtoIHCbQku4VXh6BrhE6SscvCA-s2ZNmjZu9TCYrSbJYManQALf5Up10RL5tOkPfzKXMcR99KDoxLO3zPPZLOwZS6153UHIJhFJAknkXJOCr-ESaBK-qKVPHC0rib4BRfXQmiPNkzCDKo6EPA_zajWrGumftT_mmtiwOH4FFPQUobjW6FDZrzBA8AIh3hGj7iOWYXRL9SRbPNQmvz7A9vKtXcViiayqE8crlXqEAR7S9611qyYgEJNAv501Oh_ookin7x8uPBxBQQBmcFvC6kd83iSoQhuKg6qtBocZ7PTnqDHnUKVp1evE0-nhbbfaFbaJJNFDpAXo-hcqTlYMXN4ay2jGVBiAER70sjP6zS_koBszpO9jIowtBBb-wlW-EOn2DcwKDTx8svSXGUdCTk99bPHfB5gJaNWdEf93cyseBGynXIEEgQnfYdEnglNlYIZmjMRtf9v7Mo8ACNevRpv_ufdLGbjNYSaV0O8WjmMZjga8g6PNMQ9Wv89qbzW8dwdn-q6GYf1YK_HpXgAxWY5--A1_CZpzWV-940Ci4YIB3=w450-h302-no" alt="Can't open display" /></p>
<p>　　同样的Redhat其他版本的系统遇到类似<a href="https://www.sothink.cn/archives/2015/11/rhel-cant-open-display.html">xterm Xt error</a>: <a href="https://www.sothink.cn/archives/2015/11/rhel-cant-open-display.html">Can't open display</a>: localhost:10.0的问题时，安装这个包应该都能解决问题。</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>Please install ExtUtils::Embed for /usr/bin/perl</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/11/how-to-install-extutils-embed-for-perl.html" />
    <id>tag:www.sothink.cn,2015://1.129</id>

    <published>2015-11-18T08:58:37Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary><![CDATA[ 在通过directadmin安装exim时遇到这个错误： Trying to make exim... /bin/sh scripts/source_checks &gt;&gt;&gt; Creating links to source files... &gt;&gt;&gt; Creating lookups/Makefile for building dynamic modules Please install ExtUtils::Embed for /usr/bin/perl make: *** [configure] Error 1...]]></summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="centos" label="CentOS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　在通过directadmin安装exim时遇到这个错误：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">Trying to make exim...
/bin/sh scripts/source_checks

&gt;&gt;&gt; Creating links to source files...
&gt;&gt;&gt; Creating lookups/Makefile for building dynamic modules
Please install ExtUtils::Embed for /usr/bin/perl
make: *** [configure] Error 1</pre>
</blockquote>]]>
        <![CDATA[<p>　　尝试通过cpanm命令来安装也失败了，</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">cpan[1]&gt; install ExtUtils::Embed
CPAN: Storable loaded ok (v2.51)
CPAN: LWP::UserAgent loaded ok (v6.06)
CPAN: Time::HiRes loaded ok (v1.9726)
...
Running install for module 'ExtUtils::Embed'
The most recent version "1.32" of the module "ExtUtils::Embed"
is part of the perl-5.20.0 distribution. To install that, you need to run
  force install ExtUtils::Embed   --or--
  install R/RJ/RJBS/perl-5.20.0.tar.gz
Failed during this command:
 RJBS/perl-5.20.0.tar.gz                      : make NO isa perl
</pre>
</blockquote>
<p>　　最后使用yum安装成功的：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">[root@qcloud-vps custombuild]#yum install perl-ExtUtils-Embed
[root@qcloud-vps custombuild]#./build exim
[root@qcloud-vps custombuild]#ln -s /usr/sbin/exim /usr/sbin/sendmail</pre>
</blockquote>
<p></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>升级Windows 10 后滚回 Windows 7</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/11/windows-10-go-back-to-windows-7.html" />
    <id>tag:www.sothink.cn,2015://1.128</id>

    <published>2015-11-12T08:28:00Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> Windows 10 被炒的挺火，我也尝试了一把，但是用了大概一个月，实在是无法习惯新的操作方式，决定滚回到Windows7了，如果你是从Windows 8.x升上来的，滚回去的方法是一样的。 Windows 10 开始-设置，在“更新与安全”的恢复里，即可找到滚回去的选项了。...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="windows" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　Windows 10 被炒的挺火，我也尝试了一把，但是用了大概一个月，实在是无法习惯新的操作方式，决定滚回到Windows7了，如果你是从Windows 8.x升上来的，滚回去的方法是一样的。</p>
<p>　　Windows 10 开始-设置，在“更新与安全”的恢复里，即可找到滚回去的选项了。</p>]]>
        <![CDATA[<p>　　<img src="https://lh3.googleusercontent.com/pw/AP1GczPPPeD3xaXpdppdt7cQyYit-IBBHcdDTkI-mhyOi78DnU6ACO21lNQ0H15LLESt-jCLV4ZLXp74m_kvaV3OA1r5HsTE_ltD8Gq3rwZbH_btKbOJ9bPCv6fbz0icQ1xbFZs_Yh5bP13m3MavRyb3fGVaFLxmApF8ZOoFOHiGQdV35y-6TSE_1C1GRKu6jQdLF0gdbPntPO9txYU7W-xReLU0vSoxtDh71aoV04H6ArxWBW8gULo1rA5cdMw0lv9g7lfwr-9KNAywE0vqO82W0dXITB4HzAEcrr8tfXxg-zI-xL4ijM_LhIXtMrWSu_cqrFP9PA9IZ5tY3j5Iy7Jai9NjoGQCC9lTDLUBul8wO7iVSBpX2S1bhC-sOvkN1q5hwCvczfPHr0yL1DO2reagt-2SPC6M83d3RX-lpwTDHATWDSj7--HkiEl3XoQJ6coqGy_-ILOPFWgOI0ZmWOm9e2ylfSuo3SKu6b5rCfK5fbygkLlkeq0dmWXBGb64UVHxhd1MZgGayNx1L4lANaLmZ0DW7cg2CzV0d4qtL1LMdDymaHPqPUiYSQ-JOtOitcBRnlevFlSU-2Mmrx-DqYv5dJ-CQ82dqXBKEF6AwUCefNW45_1yOAmi3zJbWkbrl6kzPrrWMhHxJME4WLS1QysSaRt4nP87zOV0AGXatRbbp5dy39wGjKdHmEVblx5cwJf5MeKVTrSk5_ReGbIxqsIV0WMTrrhJ-Y0AGwSubnta2gCGVNfjDJvrdgVGN39CSAgZKnOjXpmWGGxKX3K5YF3xYOCVl130jzu3ynmuK7IEFBoezO5cVzOTGEVaArKeu9t-DS0Vj7IH-XLn0xescD1IgZZHx5Dp12w-UPky7jdzEYKPybf9pWLvD4koz-ajDZVKxqmAL9uPuNtkeX3IJ0qSs-Hcy8KcJjaTnuansUaEXvqQYBQylO261jf5OoQomJ8GRm41lW_Y18r68ew_4fs0a90OtO5pTBvelyk0cqdm7jZfvjRkKEU7Z5Y=w480?authuser=0" alt="Back to Windows7" style="display: block; margin-left: auto; margin-right: auto;" /></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>Error reading ...Syck parser ...: syntax error</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/11/movable-type-error-reading-syck-parser.html" />
    <id>tag:www.sothink.cn,2015://1.127</id>

    <published>2015-11-03T22:36:13Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 很喜欢Movable Type 4的后台界面，所以一直拖着没有升级，这次决定将它升级到Movable Type 6。升级前先做好备份，以免发生意外。 升级过程中出现了下面的错误： Got an error: Error reading /home/username/domains/sothink.cn/public_html/cgi-bin/plugins/CommunityActionStreams/config.yaml: Syck parser (line 33, column -1): syntax error...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mt4" label="MT4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mt6" label="MT6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　很喜欢Movable Type 4的后台界面，所以一直拖着没有升级，这次决定将它升级到Movable Type 6。升级前先做好备份，以免发生意外。</p>
<p>　　升级过程中出现了下面的错误：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">Got an error: Error reading /home/username/domains/sothink.cn/public_html/cgi-bin/plugins/CommunityActionStreams/config.yaml: Syck parser (line 33, column -1): syntax error
</pre>
</blockquote>]]>
        <![CDATA[<p>　　这个问题是由于 <a href="https://github.com/movabletype/mt-plugin-community-action-streams" title="Community Action Streams for Movable Type 5" target="_blank">CommunityActionStreams</a> 插件的版本过低，系统中恰巧又安装了YAML::Syck perl模块才会出现的错误。</p>
<p>　　如果需要使用ActionStreams插件，可以将它升级到MT5使用的版本，不使用ActionStreams插件的话，可以直接将这个插件删除。</p>
<p>　　升级后感觉Movable Type快了不少。 :-)</p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>大量rcuos和rcuob进程</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/10/more-rcuob-and-rcuos-kernel-threads-running.html" />
    <id>tag:www.sothink.cn,2015://1.126</id>

    <published>2015-10-29T05:46:41Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 一台服务器安装了CentOS7，系统里有128个rcuos进程和128个rcuob进程，导致新添加的Zabbix一直提示系统的进程数过多，而服务器的CPU并没有这么多核心。 记录一下解决办法：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="窗外" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="centos" label="CentOS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　一台服务器安装了CentOS7，系统里有128个rcuos进程和128个rcuob进程，导致新添加的Zabbix一直提示系统的进程数过多，而服务器的CPU并没有这么多核心。</p>
<p>　　记录一下解决办法：</p>]]>
        <![CDATA[<p>　　方法1：将内核版本升级至kernel 3.10.0-514.el7或更新的版本，可以修复这个问题。</p>
<p>　　方法2：在grub的配置文件中，找到有vmlinuz的一行，在行尾加入 nr_cpus=<span style="color: #ff0000;"><em>N</em></span> ，重启后可以指定该内核进程的数量。比如我设置成nr_cpus=2</p>
<p style="text-align: right;">　　<strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>DirectAdmin 变更主机名和IP地址</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/10/how-to-change-directadmin-server-ip-address.html" />
    <id>tag:www.sothink.cn,2015://1.125</id>

    <published>2015-10-21T05:20:32Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 原来的VPS IP在国内无法访问了，所以更换了VPS所在区域。在DigitalOcean的后台将VPS关机，做好快照后将快照传至目的区域，然后使用快照重新创建一个VPS即可，不需要重装系统。 修改directadmin的主机名和IP地址：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="directadmin" label="Directadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　原来的VPS IP在国内无法访问了，所以更换了VPS所在区域。在<a href="https://www.digitalocean.com?refcode=1682f080ab9f&amp;utm_campaign=Referral_Invite&amp;utm_medium=Referral_Program&amp;utm_source=CopyPaste" title="Get $10 credit" target="_blank">DigitalOcean</a>的后台将VPS关机，做好快照后将快照传至目的区域，然后使用快照重新创建一个VPS即可，不需要重装系统。</p>
<p>　　修改directadmin的主机名和IP地址：</p>]]>
        <![CDATA[<p>　　1.登录directadmin后台，找到底部的Extra Features-Administrator Settings，修改hostname后重启apache服务即可。</p>
<p>　　2.修改IP地址(128.199.236.106 修改为 104.131.214.125)：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">[root@nyc2 ~]# <span style="color: #ff0000;">cd /usr/local/directadmin/scripts</span>  
[root@nyc2 scripts]# <span style="color: #ff0000;">./ipswap.sh 128.199.236.106 104.131.214.125</span>
/etc/httpd/conf/httpd.conf      : 128.199.236.106 -&gt; 104.131.214.125
/etc/httpd/conf/extra/httpd-vhosts.conf : 128.199.236.106 -&gt; 104.131.214.125
/etc/httpd/conf/ips.conf        : 128.199.236.106 -&gt; 104.131.214.125
/etc/proftpd.conf       : 128.199.236.106 -&gt; 104.131.214.125
/etc/proftpd.vhosts.conf        : 128.199.236.106 -&gt; 104.131.214.125
/etc/hosts      : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/scripts/setup.txt        : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/admin/ip.list       : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/admin/show_all_users.cache  : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/admin/user.conf       : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/admin/httpd.conf      : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/admin/ip.list : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/admin/user_ip.list    : 128.199.236.106 -&gt; 104.131.214.125
ls: cannot access /usr/local/directadmin/data/users/admin/domains/*.conf: No such file or directory
ls: cannot access /usr/local/directadmin/data/users/admin/domains/*.ftp: No such file or directory
ls: cannot access /usr/local/directadmin/data/users/admin/domains/*.ip_list: No such file or directory
/usr/local/directadmin/data/users/ollydbg/user.conf     : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/ollydbg/httpd.conf    : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/ollydbg/user_ip.list  : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/ollydbg/domains/sothink.cn.conf       : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/ollydbg/domains/sothink.cn.ftp        : 128.199.236.106 -&gt; 104.131.214.125
/usr/local/directadmin/data/users/ollydbg/domains/sothink.cn.ip_list    : 128.199.236.106 -&gt; 104.131.214.125
/var/named/sgp01.unity3dbox.com.db      : 128.199.236.106 -&gt; 104.131.214.125
/var/named/sothink.cn.db        : 128.199.236.106 -&gt; 104.131.214.125

*** Done swapping 128.199.236.106 to 104.131.214.125 ***</pre>
</blockquote>
<p>　　参考：<a href="https://help.directadmin.com/item.php?id=250" title="How to change your server IP address" target="_blank">How to change your server IP address</a></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>DirectAdmin 安装记录</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2015/10/Installing-directadmin.html" />
    <id>tag:www.sothink.cn,2015://1.124</id>

    <published>2015-10-13T04:38:17Z</published>
    <updated>2026-07-28T08:47:18Z</updated>

    <summary> 翻到一份DirectAdmin的安装记录，贴在这里供以后参考吧： 建议在screen下安装，以免安装过程中与服务器断开连接导致安装失败。关于screen的用法，可以参考：使用 screen 管理你的远程会话...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Journal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="directadmin" label="Directadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　翻到一份DirectAdmin的安装记录，贴在这里供以后参考吧：</p>
<p>建议在screen下安装，以免安装过程中与服务器断开连接导致安装失败。关于screen的用法，可以参考：<a href="https://www.ibm.com/developerworks/cn/linux/l-cn-screen/" title="linux 技巧：使用 screen 管理你的远程会话" target="_blank">使用 screen 管理你的远程会话</a></p>]]>
        <![CDATA[<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">[root@nyc2-01 ~]# <span style="color: #ff0000;">./setup.sh</span> 
*** 64-bit OS ***

*****************************************************
*
* DirectAdmin requires certain packages, described here:
*   http://help.directadmin.com/item.php?id=354
*
* Would you like to install these required pre-install packages? (y/n): <span style="color: #ff0000;">y</span>
*
* Installing pre-install packages ....
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirror.es.its.nyu.edu
 * extras: mirrors.rit.edu
 * updates: mirror.us.leaseweb.net
Package wget-1.12-5.el6_6.1.x86_64 already installed and latest version
Package gcc-4.4.7-16.el6.x86_64 already installed and latest version
Package gcc-c++-4.4.7-16.el6.x86_64 already installed and latest version
Package flex-2.5.35-9.el6.x86_64 already installed and latest version
Package bison-2.4.1-5.el6.x86_64 already installed and latest version
Package 1:make-3.81-20.el6.x86_64 already installed and latest version
Package 32:bind-9.8.2-0.37.rc1.el6_7.6.x86_64 already installed and latest version
Package 32:bind-libs-9.8.2-0.37.rc1.el6_7.6.x86_64 already installed and latest version
Package 32:bind-utils-9.8.2-0.37.rc1.el6_7.6.x86_64 already installed and latest version
Package openssl-1.0.1e-42.el6_7.4.x86_64 already installed and latest version
Package openssl-devel-1.0.1e-42.el6_7.4.x86_64 already installed and latest version
Package 4:perl-5.10.1-141.el6_7.1.x86_64 already installed and latest version
Package 1:quota-3.17-23.el6.x86_64 already installed and latest version
Package libaio-0.3.107-10.el6.x86_64 already installed and latest version
Package libcom_err-devel-1.41.12-22.el6.x86_64 already installed and latest version
Package libcurl-devel-7.19.7-46.el6.x86_64 already installed and latest version
Package gd-2.0.35-11.el6.x86_64 already installed and latest version
Package zlib-devel-1.2.3-29.el6.x86_64 already installed and latest version
Package zip-3.0-1.el6_7.1.x86_64 already installed and latest version
Package unzip-6.0-2.el6_6.x86_64 already installed and latest version
Package libcap-devel-2.16-5.5.el6.x86_64 already installed and latest version
Package cronie-1.4.4-15.el6_7.1.x86_64 already installed and latest version
Package bzip2-1.0.5-7.el6_0.x86_64 already installed and latest version
Package cyrus-sasl-devel-2.1.23-15.el6_6.2.x86_64 already installed and latest version
Package perl-ExtUtils-Embed-1.28-141.el6_7.1.x86_64 already installed and latest version
Package autoconf-2.63-5.1.el6.noarch already installed and latest version
Package automake-1.11.1-4.el6.noarch already installed and latest version
Package libtool-2.2.6-15.5.el6.x86_64 already installed and latest version
Package which-2.19-6.el6.x86_64 already installed and latest version
Package patch-2.6-6.el6.x86_64 already installed and latest version
Package bzip2-devel-1.0.5-7.el6_0.x86_64 already installed and latest version
Package lsof-4.82-5.el6.x86_64 already installed and latest version
Package db4-devel-4.7.25-20.el6_7.x86_64 already installed and latest version
Package mailx-12.4-8.el6_6.x86_64 already installed and latest version
Nothing to do
*
*****************************************************

Please enter your Client ID : <span style="color: #ff0000;">66666</span>
Please enter your License ID : <span style="color: #ff0000;">888888</span>
Please enter your hostname (server.domain.com)
It must be a Fully Qualified Domain Name
Do *not* use a domain you plan on using for the hostname:
eg. don't use domain.com. Use server.domain.com instead.
Do not enter http:// or www

Enter your hostname (FQDN) : <span style="color: #ff0000;">nyc2-01.mydomain.com</span>
Client ID:  66666
License ID: 888888
Hostname: nyc2-01.mydomain.com
Is this correct? (y,n) : <span style="color: #ff0000;">y</span>
The following ethernet devices/IPs were found. Please enter the name of the device you wish to use:

eth0       161.243.241.22
eth1       

Enter the device name: <span style="color: #ff0000;">eth0</span>
Your external IP: 161.243.241.22
The external IP should typically match your license IP.

Is 161.243.241.22 the IP in your license? (y,n) : <span style="color: #ff0000;">y</span>

DirectAdmin will now be installed on: Enterprise 6.7
Is this correct? (must match license) (y,n) : <span style="color: #ff0000;">y</span>

You now have 4 options for your apache/php setup.

1: custombuild 2.0       Apache 2.4, mod_ruid2, php 5.5. Can be set to use mod_php, php-FPM or fastcgi.
2: custombuild 1.1:      end-of-life software.  Apache 2.x, php 4, 5, or both in cli and/or suphp. Defaults to php 5.2
3: custombuild 1.2:      Production version: Apache 2.x, php 5 in cli or suphp. Defaults to php 5.3
4: custombuild 2.0 BETA: Apache 2.4, php-fpm, php 5.6. Can be set to use mod_ruid2, mod_php, php-FPM or fastcgi.

      Post any issues with custombuild to the forum: http://forum.directadmin.com/forumdisplay.php?f=61

Enter your choice (1, 2, 3 or 4): <span style="color: #ff0000;">3</span>
You have chosen custombuild 1.2.
--2016-03-15 01:50:29--  http://files.directadmin.com/services/custombuild/1.2/custombuild/build
Resolving files.directadmin.com... 208.167.226.3, 216.144.254.90, 69.162.69.58
Connecting to files.directadmin.com|208.167.226.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 333836 (326K)
Saving to: “/usr/local/directadmin/custombuild/build”

100%[==================================================================================================&gt;] 333,836     --.-K/s   in 0.02s   

2016-03-15 01:50:29 (21.0 MB/s) - “/usr/local/directadmin/custombuild/build” saved [333836/333836]


Would you like the default settings of apache 2.2 and php 5.3 cli? (y/n): <span style="color: #ff0000;">n</span>
You have chosen to customize the custombuild options.  Please wait while options configurator is downloaded... 

Cannot find /usr/local/directadmin/custombuild/options.conf, writing defaults.
Downloading             versions.txt...
--2016-03-15 01:50:41--  http://files.directadmin.com/services/custombuild/versions.txt
Resolving files.directadmin.com... 208.167.226.3, 216.144.254.90, 69.162.69.58
Connecting to files.directadmin.com|208.167.226.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10731 (10K) [text/plain]
Saving to: `/usr/local/directadmin/custombuild/versions.txt'

100%[==================================================================================================&gt;] 10,731      --.-K/s   in 0s      

2016-03-15 01:50:41 (371 MB/s) - `/usr/local/directadmin/custombuild/versions.txt' saved [10731/10731]

Would you like to backup the current options.conf? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have PHP5 as CLI or CGI? (cli/cgi): <span style="color: #ff0000;">cgi</span>
Would you like to have ionCube? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have Zend Optimizer? (yes/no): <span style="color: #ff0000;">yes</span>
********
For new DirectAdmin installs, we don't recommend updating MySQL until after everything is finished
We recommend using 'no' here to use the already included precompiled binaries.
You can still update MySQL later.

Would you like to have an ability to update/instal MySQL using CustomBuild? (yes/no): <span style="color: #ff0000;">yes</span>
Which version of MySQL you would like to have? (5.0/5.1/5.5/5.6): <span style="color: #ff0000;">5.6</span>
Which version of Apache you would like to have? (1.3/2.0/2.2): <span style="color: #ff0000;">2.2</span>
Would you like to prevent htaccess files from using Options FollowSymLinks? More secure, but may break scripts. (yes/no): <span style="color: #ff0000;">yes</span>
Would you like to have an ability to update/instal Exim using CustomBuild? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have an ability to install Dovecot? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have an ability to install/update phpMyAdmin using CustomBuild? (yes/no): <span style="color: #ff0000;">yes</span>
Would you like to have an ability to install/update SquirrelMail webmail using CustomBuild? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have an ability to install/update RoundCube webmail using CustomBuild? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have an ability to install/update UebiMiau webmail using CustomBuild? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to have an ability to install/update Atmail Open webmail using CustomBuild? (yes/no): <span style="color: #ff0000;">no</span>
Would you like to search for the fastest download mirror? (y/n): <span style="color: #ff0000;">y</span></pre>
</blockquote>
<p>　　安装完成后，用户名和密码会显示在终端上。</p>
<p>　　如果你安装的是开心版，可能会遇到下面的问题（改用CentOS 5.x）：</p>
<blockquote>
<p>1. <a href="https://www.sothink.cn/archives/2014/08/bad-elf-interpreter-no-such-file-or-directory.html" title="bad ELF interpreter 错误" target="_blank">ld-linux.so.2: bad ELF interpreter</a></p>
<p>2. <a href="https://www.sothink.cn/archives/2014/08/directadmin-error-while-loading-shared-libraries-libsslso6.html" title="libssl.so.6: cannot open shared object file" target="_blank">error while loading shared libraries: libssl.so.6</a></p>
</blockquote>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

<entry>
    <title>Cannot load the ionCube PHP Loader</title>
    <link rel="alternate" type="text/html" href="https://www.sothink.cn/archives/2014/10/cannot-load-the-ioncube-php-loader.html" />
    <id>tag:www.sothink.cn,2014://1.123</id>

    <published>2014-10-05T03:43:24Z</published>
    <updated>2026-07-28T08:47:17Z</updated>

    <summary> 在Apache的errorlog里发现多条这样的日志： Cannot load the ionCube PHP Loader - it was built with configuration API220090626,NTS, whereas running engine is API220100525,NTS, referer: 初步判断是由于ionCube和PHP版本不匹配的问题导致的。下面是排查过程：...</summary>
    <author>
        <name>有所思</name>
        <uri>https://www.sothink.cn</uri>
    </author>
    
        <category term="Notes" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="https://www.sothink.cn/">
        <![CDATA[<p>　　在Apache的errorlog里发现多条这样的日志：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">Cannot load the ionCube PHP Loader - it was built with configuration API220090626,NTS, whereas running engine is API220100525,NTS, referer:</pre>
</blockquote>
<p>　　初步判断是由于ionCube和PHP版本不匹配的问题导致的。下面是排查过程：</p>
<p></p>]]>
        <![CDATA[<p>　　1.首先检查ionCube是否被正确加载：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">#php -m</pre>
</blockquote>
<p>　　这个命令会将php加载的所有模块列出，检查看是否有ionCube和Zend模块。</p>
<p>　　2.查看PHP版本：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">#php -v</pre>
</blockquote>
<p>　　同样会有 <a href="https://www.sothink.cn/archives/2014/10/cannot-load-the-ioncube-php-loader.html">Cannot load the ionCube PHP Loader</a> 的提示。</p>
<p>　　3.检查已安装的ionCube：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">#locate ioncube
/usr/local/lib/ioncube_loader_lin_5.3.so
/usr/local/lib/ioncube_loader_lin_5.4.so</pre>
</blockquote>
<p>　　4.检查php.ini设置：</p>
<p>　　发现在php.ini中同时配置了两个版本的ioncube，使用分号注释掉和当前PHP版本不匹配的ioncube。</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">zend_extension=/usr/local/lib/ioncube_loader_lin_5.4.so
;zend_extension=/usr/local/lib/ioncube_loader_lin_5.3.so
zend_extension=/usr/local/lib/ZendGuardLoader.so</pre>
</blockquote>
<p>　　5.重新加载php.ini：</p>
<blockquote>
<pre style="background-color: #f3f3f3; border: 1px solid #dddddd; margin-top: 0px; margin-bottom: 0px; outline: 0px; padding: 12px; vertical-align: baseline; overflow: auto; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; color: #333333;">#service httpd reload</pre>
</blockquote>
<p></p>
<p style="text-align: right;"><strong>本文结束。</strong></p>]]>
    </content>
</entry>

</feed>
