如何设置宝塔面板优化 php 服务器性能-魏艾斯博客

mikel阅读(1367)

来源: 如何设置宝塔面板优化 php 服务器性能-魏艾斯博客

为了提高 php 服务器性能,安装宝塔面板的服务器需要设置一下。整个设置过程很简单,魏艾斯博客把如何设置宝塔面板提高服务器性能的过程写下来,希望能帮到初次使用宝塔面板的朋友们。

群里面太多朋友初次接触 php 环境和宝塔面板,而且很多人用 avada、The 7、newspaper、Enfold、Betheme、 Richer 等耗费系统资源的 wordpress 模板,如果不做额外优化真的打开很慢,比如一个朋友使用阿里云 ECS 国内服务器,2 核 8g 内存 40g 系统盘 100g 数据盘 5m 带宽,newspaper 主题,艺术类网站以图片为主,首页就是一个大 banner 和 N 多图片,全高清高分辨率那种的,联通百兆光纤打开需要近 10 秒钟,他自己也很不满意。要知道国内带宽成本极高,一台云服务器接近一半成本是带宽费用,普通网站 1M 带宽起步也不错了而他买了 5M 还慢,所以不优化一下真的不好意思让客户上来看。

宝塔面板是我们再熟悉不过的国产 Linux 面板了,目前在国内可以说是风声水起,用户量不断上涨。有关宝塔面板的安装使用在魏艾斯博客里面已经写过很多了,不再啰嗦。为了让服务器运行速度更快,我们就使用宝塔面板提供的功能来优化一下服务器配置。本文部分内容参考自@很文博客,老魏根据大家遇到的问题和自己的经验加以补充和丰富。

关于宝塔面板的入门基础知识:

1、定期释放内存

添加计划任务,可以设置每天或一周释放一次,间隔时间根据自己网站情况定,执行时机为半夜,如:1:30。

看下图,在宝塔面板左侧的计划任务中操作即可。

2、添加 Swap

关于 Swap 的重要性在lnmp 中创建、启用 SWAP 分区详细教程中已经写过了,无论服务器内存多大都必须添加 Swap。在宝塔面板的软件管理>>系统工具中找到 Linux 工具箱 1.4,点击最右侧的“设置”打开 Swap 虚拟内存,按照下面的推荐值进行设置。

Swap 推荐值:2G 和 2G 以下内存的服务器,设置成和物理内存相同容量 SWAP;2G 以上的,设置为 2G。如果跑的程序特别耗费内存,2G 内存以上的 Swap 也可以设置与内存相同。

3、安装 PHP 缓存扩展

个人博客的 php 缓存扩展推荐使用 Opcache 脚本缓存和 Memcached 内容缓存。在软件管理>>你使用的 php 版本最右侧点击“设置”,进入安装扩展,右侧点击这两个扩展后面的“安装”,再确认一次,很快搞定。

内容缓存和脚本缓存都只安装一个,不要同时安装多个。

其他的扩展组件,在确认用不到的前提下,都卸载掉,因为开着还不用会浪费系统资源。

4、php 配置调整

同样在 php 管理的配置修改中,memory_limit 脚本内存限制修改成 256M,这样 wordpress 跑起来更顺畅了;upload_max_filesize 允许上传文件的最大尺寸,像 avada 模板可能会超过这个数值无法上传,需要修改为大于上传文件的数值。

在配置文件中 Ctrl+F 搜索 memory_limit,把默认值修改成 256M,保存。下图是老魏改好后的。

5、PHP 并发调整

宝塔面板提供了几个优化过的 php 并发方案,一般 1 核 1G 内存的云服务器,设置 30 并发或 50 并发都可以,其他配置请自己测试一下合适并发方案。不建议并发超过 300 ,如果并发不够用还是优化数据库缓存可能更有效。

6、php 版本和 MySQL 数据库版本

php7 的性能比低版本有很大提升,老魏强烈建议使用 php7 以上版本;1 核 1G 配置的数据库推荐 MySQL5.5,而 5.6 要求最低内存 1G 以上,所以大家应该知道如何选择了。

7、卸载多余扩展组件

如果程序不需要,就卸载 ZendGuardLoader、ioncube、PATH_INFO,安装后不用也一直占用一部分内存。

设置完了要重启服务器,让调整后的参数生效。

8、像本文开头提到的群友网站高清图片较多的,如果达到几千张且还要不停增加的话,建议先点我领取千元代金券,再购买阿里云 ECS 云服务器的基础上搭配阿里云存储 OSS,把图片分流到 OSS 存储空间上去,ECS 只放程序部分,这样网站打开速度会快很多的。

9、WordPress 如何优化提升速度,这是个永恒的任务。想让网站加载速度快,优化的关键是找到平衡点,点我打开在线课程开始学习,全面分析原因并给出相对应的一整套解决方案。

以上优化方案分别在阿里云服务器(点我领取千元代金券 抵用 50 元起)和腾讯云服务器(点我五折优惠购买)上测试通过。

宝塔面板官方网站:点我直达

1、宝塔官方赠送3188元优惠券礼包。

2、新用户可享受0.99元体验1个月专业版。

经过上面的一番折腾整理优化,你的云服务器应该比之前流畅很多了,没有做到的同学赶紧去试试吧,也可以在下面留言交流你认为更合适的优化方案。

宝塔面板安装memcached的误区及正确方法-魏艾斯博客

mikel阅读(1527)

来源: 宝塔面板安装memcached的误区及正确方法-魏艾斯博客

宝塔面板添加memcached可以有效加速服务器访问速度,提高网站的用户体验。不过在实际使用中,魏艾斯博客发现很多新手有一个误区,就是添加了错误的memcached组件,导致起不到正常加速服务器的效果。本文中魏艾斯博客分享一下误区在哪里以及应该怎么安装是正确的加速组件。

参考资料:宝塔面板安装memcached及详细配置方法

宝塔面板官方网址:点我进入

1、宝塔官方赠送3188元优惠券礼包。

2、新用户可享受0.99元体验1个月专业版

1、错误的memcached组件添加方法

很多人直接安装下图中蓝色M字样的memcached组件。从这里安装后,服务器不会有加速效果,访问网站也不会感觉到比以前快。

2、正确的memcached安装方法

以老魏目前使用的php版本为例,正确安装方法是在“软件管理”的php7.0>设置中,找到“安装扩展”右侧的memcached,安装。这才是正确的memcached组件。安装完成后,再返回看到上图蓝色M字样的memcached已经自动安装上去了,无需人工干预。

也就是说这里有一个顺序问题,老魏测试了一下,如果你先安装上图蓝色M字样的Memcached,那么下图php7.0的memcached不会被安装,同样也起不到加速效果,失败;若先去php7.0中安装memcached,再返回会看到蓝色M字样的Memcached已经被自动安装好了,这时候服务器会加速,网站打开也会成倍提速,这才是正确的安装步骤和效果。请大家一定注意这个顺序不能乱搞,搞错了你会埋怨老魏分享错误、无效的资料,浪费你的时间、精力,却还没效果,其实是你把这个顺序搞颠倒了。

安装memcached组件后,还要安装一个插件,叫 memcached is your friend 这个插件。具体安装过程请移步安装 memcached 和 object-cache.php 中的第二步提到的这个插件,按照要求安装就可以了。宝塔面板如果不安装的话,memcached就不会正常工作了,命中率一直是0。

3、用宝塔面板加速

通过宝塔面板优化服务器速度、性能的参考资料如何设置宝塔面板优化 php 服务器性能,写的很详细了,这里不再啰嗦。

这个memcached是从服务器层面加速,比wordpress插件那种程序层面加速要快上很多,占用资源也小。因为wordpess缓存插件的原理是把数据库内容缓存到硬盘中,而memcached是缓存到内存中。内存的读取速度是几倍于硬盘读取速度的。不过你使用了memcached就必须卸载掉wordpress super cache之类的缓存插件,因为都是缓存插件会互相影响效果。

至于memcached的效果如何检测,有两种方法:一是使用宝塔面板自带的检测功能,不够直观;二是使用第三方php文件,很直观。操作起来很简单,请移步多种方法实时监测 Memcached命中率

ECSHOP怎樣可以取消用手机上网时,不自动转到mobile页面 - wpindesign - 博客园

mikel阅读(763)

来源: ECSHOP怎樣可以取消用手机上网时,不自动转到mobile页面 – wpindesign – 博客园

打开 index.php 删除以下代码

$ua = strtolower($_SERVER['HTTP_USER_AGENT']);

$uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|mobile)/i";

if(($ua == '' || preg_match($uachar, $ua))&& !strpos(strtolower($_SERVER['REQUEST_URI']),'wap'))
{
$Loaction = 'mobile/';

if (!empty($Loaction))
{
ecs_header("Location: $Loaction\n");

exit;
}

宝塔面板的ftp无法使用解决 - 代码仔-兴江 - 博客园

mikel阅读(1031)

来源: 宝塔面板的ftp无法使用解决 – 代码仔-兴江 – 博客园

宝塔面板的ftp无法使用解决

先检查这些内容

1.注意内网IP和外网IP

2.检查ftp服务是否启动 (面板首页即可看到)

3.检查防火墙20端口 ftp 21端口及被动端口39000 – 40000是否放行 (如是腾讯云/阿里云等还需检查安全组)

注意:最好到配置文件修改端口一致

PassivePortRange 39000 40000

截图:

 

 

放行对应的防火墙端口:

 

 

4.是否主动/被动模式都不能连接

5.新建一个用户看是否能连接

6.更换ftp客户端使用flashfxp 如图勾上 再尝试连接

 

 

但凡解决了就可以登陆了,如果还是不行,那么试试最后一种方法:

登陆宝塔面板管理系统,找到左侧的“软件管理”–“FTP软件”—点击“设置”

 

 

然后点击配置修改:如图所示,查找“ForcePassiveIP”(位置188行左右)

# ForcePassiveIP                192.168.0.1

删除前面的“#”将“192.168.0.1”修改为:服务器的IP地址,是服务器不是你客户端的IP地址!

ForcePassiveIP  服务器公网ip地址

 

 

最后修改完记得重新启动一下FTP软件,打开FTP连接,你会发现奇迹发生了

win10 中ie浏览器闪一下就没有了应该怎么处理 - 系统族

mikel阅读(2551)

WIndows10系统中主流浏览器已经变成了Edge,但是有些网站指定需要使用ie打开。有些小伙伴打开IE一会就闪退那要怎么解决呢?别急,下面就给

来源: win10 中ie浏览器闪一下就没有了应该怎么处理 – 系统族

WIndows 10系统中主流浏览器已经变成了Edge,但是有些网站指定需要使用ie打开。有些小伙伴打开IE一会就闪退那要怎么解决呢?别急,下面就给大家简单细说一下。

系统推荐:win10系统下载

1、原因分析:出现这样的情况一般是由于ie中【第三方浏览扩展】导致的

解决方法一:按住windows+r调出运行,在框中输入:inetcpl.cpl  点击确定;

win10 中ie浏览器闪一下就没有了应该怎么处理

2、在【internet  属性】界面点击【高级】选卡,在下面框中将“启用第三方浏览器扩展”和“启用自动崩溃恢复”的勾去掉,点击应用并确定即可。

win10 中ie浏览器闪一下就没有了应该怎么处理

上面就是关于win10打开ie就闪退的解决方法,有遇到这个问题的小伙伴可以按照小编的步骤实地操作一下,想了解更多win10系统的知识,请大家关注系统族!

可以编写代码的代码:代码生成的利与弊 - 聚变归来 - 博客园

mikel阅读(728)

来源: 可以编写代码的代码:代码生成的利与弊 – 聚变归来 – 博客园

代码生成的当前状态

代码生成的当前状态是无处不在的(2019年春季)。
如今,代码生成发生在软件堆栈的每一层,

  • 包括Java库(如swagger CodeGen),
  • 最新的交叉编译器/编译器(如针对JavaScript应用程序的Babel)
  • 以及全栈生成器(如Starter StackGen(tm))

REST API的数量激增,导致在过去十年中针对各种编程语言和环境开发的API客户端生成器种类繁多。
就像某种巨大的数字Turducken一样,REST API及其生成的客户端似乎能够将任何事物连接到任何事物。
因此,让我们看一下代码生成管理中涉及的火鸡,鸭子和小鸡……

1.代码重写

自动编码的一种广泛形式是代码重写-用于将一种语言版本的语法转换为另一种语言,有时甚至完全转换为另一种语言。
例如,诸如Scala之类的语言实际上是将您的代码重写为与Java兼容的代码。
著名的奇怪的Lombok项目基本上在您键入时重写Java代码,生成幻像方法,因此您可以专注于出色。
就像Babel一样,任何优秀的JavaScript开发人员都可以证明“编译器”是如何将您的高级ES2017重写为已使用了10年的,与浏览器兼容的旧版JavaScript,因此您可以编写现代代码,而不必担心浏览器的行为方式。

让计算机进行肮脏的工作??甜!

2.基于模板的生成

React生态系统在创建基于模板的应用程序框架(包括React的“ create-react-app” CLI命令)方面特别活跃。
在整个软件行业中,其他基于模板的代码生成也很普遍。HTML模板和流行的新静态站点生成器通常利用流行的胡须或车把模板引擎来利用模板解析。
在服务器模板引擎(例如Velocity)以及基于服务器的胡须和车把实现中,吐出了预渲染的源文件(例如HTML和越来越多的JavaScript)。

3.运行时动态代码

模板并不是生成代码的唯一方法。
通过自省,例如Java和Java Reflection API等语言以及Ruby Metaprogramming,运行代码可以是“自我感知”的,一旦您的代码自我感知,构建真正动态应用程序的选项就会真正扩展。
在Starter,我们使用Java构建了StackGen生成器引擎,这意味着我们能够使用便捷的JavaPoet库来动态构建Java类文件,其中包括在运行时动态合成的功能。有趣的是,这些类可以在内存中编译并由类加载器加载,而无需写入磁盘。
他们说Java不是动态语言!
这种类型的动态生成的代码令人兴奋,因为它不仅节省了我们手动编写代码的时间和金钱,而且还提供了机会在运行时在应用程序中创建响应行为,而无需人工干预(可能基于AI决策)使我们的应用程序和数字体验比以往更具吸引力和实用性。

但是生成的代码很烂!

不幸的是,软件行业的历史上充斥着代码生成器,无代码开发工具,所见即所得前端生成器的示例,并被似乎从未消亡的古老平台吐出的普遍的加密源代码恐怖所困扰(我正在寻找在您的DreamWeaver Ultradev上还是应该说Drumbeat 2000 ?!)。
当机器充满了晦涩的技术和混乱的变量名时,谁想要处理机器吐出的代码?生成的昔日代码只是令人沮丧和悲伤,而您想要建立的任何东西都没有。

幸运的是,时代变了

在2019年,工具和软件开发的最佳实践已经发展到人类和机器可以真正在中间相遇的地步。诸如APIcur.io,StackGen和Microsoft PowerApps之类的代码生成器经过发展,可以克服过去的局限性,同时将所有代码生成技术中的最佳功能结合到现代开发工具中。

代码生成的优点

  • 无需手动编码=更少的错误
  • 实现更大,更复杂的模式可能节省大量时间
  • 简单应用和PoC的快速上市周期
  • 稳定的基础架构意味着更少的时间浪费
  • CI / CD友好,可以将代码生成作为步骤添加到任何CI管道或开发工作流程中
  • 端到端生成消除了处理多个源文件和文件类型时的错误
  • 可以将新功能集成到基础模板中,以在单个构建中跨大型代码库实现
  • 但这并不是说代码生成没有缺点。

代码生成的缺点

  • 并非所有应用程序都将从代码生成中受益
  • 与手动选择每个代码库,模式和编码样式相比,代码生成更加不灵活
  • 对基础模板的更改将推广到所有生成的文件,因此更改必须高度兼容并经过全面测试
  • 生成的代码必须在代码库中与开发人员代码仔细隔离- 存在覆盖开发人员代码的风险,并且应该可以在不影响任何现有代码的情况下进行重新生成
  • 代码生成会增加一些复杂性-例如,要真正了解生成器并与之合作,您需要了解生成的代码及其原因-除了代码库的常规问题之外
  • 编写其他代码的编写代码的思维模式可能会变得松散,尤其是在编写生成其他应用程序的应用程序时

LCDP和将创新推向边缘

LCDP(低代码开发平台)作为“无代码开发”的最新形式以及桥接高级用户/ jr的新方法而受到关注。开发者差距。
随着对新功能和新系统需求的增长,开发人员变得捉襟见肘,许多用户被超载的Excel电子表格所束缚,或者由于各个级别的开发人员资源稀缺而根本没有所需的软件功能。
消费者SaaS解决方案可以完成许多一次性任务,但是一堆杂乱无章的Web应用程序和服务并不是满足许多需求的可靠基础。
另一方面,对于许多组织来说,昂贵的企业系统根本不是一个选择。
除了节省开发成本外,授权“公民开发人员”在适当时构建自己的解决方案是LCDP价值主张的主要驱动力。
代码生成器直接位于解决方案域的中间。

使用OpenAPI和StackGen端到端生成

StackGen采用整体方法来生成代码-基于OpenAPI / Swagger模式。
开发从一开始就开始,重点是使用OpenAPI / Swagger设计出色的API 。
然后,该设计准则使您可以生成具有可预测行为的健壮堆栈,并使用此处的任何自定义逻辑和前端设计对其进行精确扩展。
为了达到这种灵活性,StackGen使用了3种代码生成步骤以及3种不同的实现方式。
系统的3个主要组件使用了多种生成技术:Swagger CodeGen,MyBatis生成的DAO和映射,以及即将到来的StackGen PRO,ReactJS前端生成。
Swagger CodeGen和StackGen React代码都使用Mustache从Mustache模板文件生成React内容。

  • Mustache
  • JavaPoet
  • Swagger CodeGen
  • MyBatis Generator

这种方法的优势在于它是可插入的,并允许我们在运行时和编译之前生成。
通过生成对开发人员友好的格式的高质量源代码,现代代码生成器在提供现代高度可扩展且健壮的基准代码库的同时,使全栈开发人员的效率倍增。

关于作者

约翰·麦克马洪(John McMahon)是Starter Inc.的首席执行官,该公司是Extentech Inc的创始人,并且多年来是StackGen,Sheetster,OpenXLS,ExtenXLS和众多软件项目的开发商。

翻译原文

https://medium.com/bigdecimal/code-that-codes-pros-and-cons-of-code-generators-15b2e571281a

MSSQl分布式查询 - chenkai - 博客园

mikel阅读(665)

来源: MSSQl分布式查询 – chenkai – 博客园

MSSQLServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 它需要连接多个MSSQL服务器也就是具有多了数据源.实现在服务器跨域或跨服务器访问. 而这些查询是否被使用完全看使用的需要.

 

本篇将演示利用SQLExpress链接远程SQLServer来获取数据方式来详细说明分布式查询需要注意细节.先看一下系统架构数据查询基本处理:

memcached

 

 

 

 

 

 

 

 

 

 

 

 

 

当然如果采用了分布式查询 我们系统采取数据DataBase也就可能在多个远程[Remote Server]上访问时:

2010-09-08_181001

 

 

 

 

 

 

 

 

 

 

 

 

如上截取系统架构中关于数据与缓存流向中涉及的分布式查询业务, 当我们从客户端Client发起请求数据时. 首先检查MemCache Server缓存服务器是否有我们想要数据. 如果没有我需要查询数据库.  而此时数据要求查询多个远程服务器上多个数据库中表, 这时利用分布式查询.获得数据 然后更新我们在缓存服务器MemCache Server上数据保持数据更新同步, 同时向客户端Client直接返回数据.那如何来执行这一系列动作中最为关键分布式查询?

<1>分布式查询方式

我们知道Microsoft微软公用的数据访问的API是OLE_DB, 而对数据库MSSQlServer 2005的分布式查询支持也是OLE_DB方式.SQL Server 用户可以使用分布式查询访问以下内容:

A:存储在多个 SQL Server 实例中的分布式数据

B:存储在各种可以使用 OLE DB 访问接口访问的关系和非关系数据源中的异类数据

OLE DB 访问接口将在称为行集的表格格式对象中公开数据。SQL Server 允许在 Transact-SQL 语句中像引用 SQL Server 表一样引用 OLE DB 访问接口中的行集,[其实不用关心这个行集概念 它的功能类似SQl中临时表 不过它容积更大 能容纳类型更多 更丰富]

SQL Server 实例的客户机与 OLE DB 访问接口之间的连接 如下图:

2010-09-08_182420

 

 

 

 

 

 

 

 

上图可以看出.客户端借助OLEDB接口可以访问Oracle/MS Jet/MS SQL/ODBC/第三方等这些丰富数据源来我们分布式查询提供数据. 说了这么多关于OLEDB底层支持. 关于在MSSQL2005中则支持两种方式来进行分布式查询:

<A>使用添加链接服务器方式(Add Link Server)

<B>使用特定名称及特定数据源来直接指定(Add Host Names)

 

其实这两种方式在实际运用中是有区别的:

方式A:Add Link Server方式建立服务器之间关联.创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问. 一般适用于持久的数据操作 对于数据量偏大 服务器之间交付时间长特点.

方式B: Add Host Name 利用域来唯一识别数据库以及数据库表对象. 来实现跨服务器访问. 这种方式一般比较简单 主要适用于对数据需求临时性查询是使用偏多. 不适合做大批量数据提取. 有性能瓶颈.

<2>分布式查询实现

 

在进行实现分布式查询之前.本次测试Demo对应的SQL版本:

2010-09-09_110812

 

 

 

 

 

 

 

确定SQLServer版本后如下会演示两种方式来实现分布式查询,并对Distributed Query中详细细节进行说明.

<2.1>链接服务器查询

链接服务器配置使 SQL Server 可以对远程服务器上的 OLE DB 数据源执行命令。链接服务器具有以下优点:

  1. 访问远程服务器。
  2. 能够对企业内的异类数据源发出分布式查询、更新、命令和事务。
  3. 能够以相似的方式确定不同的数据源

下图显示了链接服务器配置的基础:

IC99086

 

 

 

 

 

 

 

 

 

 

现在利用链接服务器方式实现数据访问远程服务器数据库CustomerDB中Users表数据先本地添加LinkServer:

   1:  -- 建立连接服务器  第一步建立连接  IP方式来控制
   2:  
   3:  EXEC sp_addlinkedserver   '192.168.10.104' , 'SQL Server'
   4:  
   5:  -- 查看链接服务器信息  [测试连接成功]
   6:  
   7:  select name , product, provider, data_source, query_timeout, lazy_schema_validation, is_remote_login_enabled, is_rpc_out_enabled
   8:  from sys.servers
   9:  where is_linked= 1

 

如上市建立连接服务器最简单方式.建立链接服务器过程其实调用了系统存储过程Sp_addlinkedserver. 第一个参数为Name 其实用来唯一标识链接服务器. 当然可以其他任何有意义字符串来定义,但我个人建议使用远程服务器的IP来标识.第二个参数是要添加为链接服务器的 OLE DB 数据源的产品名称. 默认为Null,如果指定”SQlServer“则无需指定其他参数.

如果你的本地装有多个数据库实例. 第一个种方式就不适用.这是就需要用SQl2005架构来唯一标识:

   1:  -- 含架构名  查询数据两种模式

   3:  select top 10 * from [192.168.10.104]. wl . 架构名 . 表名

   5:  -- 架构名 [采用默认架构名 ]

   7:  select top 10 * from [192.168.10.104]. CustomerDB . dbo. Users

 

对于Sql2005架构这个概念很多人比较陌生:

架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。 例如,为了避免名称冲突,同一架构中不能有两个同名的表。两个表只有在位于不同的架构中时才可以同名 例如本次Demo 在CustomerDB后对应DBO既是默认的架构名.

创建后.如果需要修改连接服务器属性可以通过sp_serveroption系统Proc来设置:

   1:  -- 配置链接服务器属性 sp_serveroption为远程服务器和链接服务器设置服务器选项
   2:  -- 语法  sp_serveroption [@server =] 'server',[@optname =] 'option_name',[@optvalue =] 'option_value'
   4:  exec sp_serveroption '192.168.10.104','name','192.168.10.104'
   6:  -- 查看连接服务器
   7:  select * from sys.servers

建立后我就可以直接来查询远程服务器上数据:

   1:  -- 查询远程服务器数据

   3:  select * from [192.168.10.104].CustomerDB.dbo.Users   --[成功]

   5:  -- sp_droplinkedsrvlogin 删除链接服务器登录名映射 [删除登录映射]
   6:  -- 如果为 NULL,那么将会删除由 sp_addlinkedserver 创建的默认映射 [第二个参数]
   8:  exec sp_droplinkedsrvlogin '192.168.10.104' ,NULL
  10:  -- 删除链接服务器属性 [删除服务器]
  12:  exec sp_dropserver 'mytest' --[删除成功 同时也删除了Sys_Server信息]
  14:  -- 查看服务器详细信息
  15:  EXEC sp_helpserver
查询结果:
 2010-09-09_120510

 

 

 

 

 

 

测试查询成功.远程数据成功获取.

当测试完成后我们不需要这个连接服务器是即可利用SP_DroplinkServer删除掉. 对应参数为创建时Name唯一标识. 通过Sp_helpserver来查看连接服务器详细信息.

注意如上创建连接服务器时设置srvproduct参数即OLED数据源名称时我们采用了SQlServer方式.

下面说明这种方式特点.:

这种方式是最为简单直接的一种建立链接服务器方式. 但是存在前提的. 测试发现:

在所有数据库的远程连接 dbo 的方式必须建立在 SA 密码相同的基础上 ,否则容易产生无法连接的情况 Sa用户登录失败. 你也就明白这个SQlServer参数其实就是在本地数据拷贝服务器角色SysAdmin下用户SA.来对服务器进行登录. 如果你的本地Sa密码与远程服务器上密码不一致 则无法正常连接.

经过测试还发现一种情况:

利用Windows7访问XP(Sp2)系统时始终提示无法解析或拒绝连接SQlServer2005.这个问题我整了好久后来才到官方链接参数中发现.:如果你的XP系统没有打上SP4的补丁包 这个问题会始终出现. 需要特别注意.

<2.2>直接指定数据源分布式查询

其实相对第一种方式, 直接指定方式在SQlServer架构中 其实跳过本地与远程服务器建立映射关系的这一步. 通过链接关系建立 其实就是建立一种内部映射关系. 如果没有映射关系则 大部分设置需要手动控制.

直接指定数据源方式 需要开启分布式查询的基本权限 来进行查询:

   2:  -- 如果想使用分布式查询,必须先开通分布式查询 [外围配置 这点是所有查询操作前提]
   3:  -- sp_configure--显示或更改当前服务器的全局配置设置
   4:  -- reconfigure 指定如果配置设置不需要服务器停止并重新启动,则更新当前运行的值
   5:  -- SQL2005默认是没有开启’Ad Hoc Distributed Queries’ 组件 
   6:  
   7:  -- 启用权限
   8:  exec sp_configure 'show advanced options',1  -- 显示高级配置
   9:  reconfigure -- 更新值
  10:  exec sp_configure 'Ad Hoc Distributed Queries',1 -- 启用分布式查询
  11:  reconfigure
  12:  go
  14:  
  15:  -- 关闭分布式查询
  16:  exec sp_configure 'Ad Hoc Distributed Queries',0
  17:  reconfigure
  18:  exec sp_configure 'show advanced options',0
  19:  reconfigure
  20:  go
  23:  -- 开启权限后 另外一种查询方式
  24:  -- 查询格式
  25:  SELECT * FROM OPENDATASOURCE(
  26:   'SQLOLEDB',
  27:   'Data Source=远程ip;User ID=sa;Password=密码'
  28:   ).库名.dbo.表名
  29:   WHERE 条件

  31:  -- 需要开启权限 
  32:  -- 开启权限 提示[远程的SqlServer不允许远程连接]
  34:  select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.10.67; User ID=sa; Password=chenkai').wl.dbo.Users

开启权限后. 需要里利用ReConfig命令来确认.对目前分布式查询权限的修改. 如果在使用完分布式查询后注意关闭.最后查询结果:

2010-09-09_120510

 

 

 

 

 

 

测试成功.

有些人说使用数据库角色SysAdmin角色下的Sa用户进行远程数据传输和验证. 不安全. 其实在使用过程中应该不难看出. 在从远程服务器拉取数据库过程中. 本地数据库需要对权限,创建连接服务器都需要最大用户权限来操作. 而服务器呢, 只需要能连接上 同时对指定数据CustomerDB具有读写的权限即可. 当然你更多远程操作可以把用户赋予CustomerDB的OWner角色.

这时我们如何用非SA用户来来连接远程用户?

我们现在远程服务器上对连接创建一个用户名为Test的用户 服务器角色设置Public即可:

2010-09-09_131004

 

 

 

 

 

在用户角色设置中需要对指定访问数据CustomerDB具有读写权限:

2010-09-09_131120

 

 

 

 

 

 

 

在远程服务器创建TEst用户时使用SQlServer身份验证方式登录 这时设置密码为RemoteDB.在使用非Sa用户进行远程:

   1:  -- 执行前先删除已经存在数据
   2:  Exec sp_droplinkedsrvlogin [192.168.10.76],Null
   3:  Exec sp_dropserver 'demodb'
   4:  
   5:  -- 创建服务器连接
   6:  EXEC  sp_addlinkedserver
   7:        @server='demodb',-- 被访问的服务器别名 
   8:        @srvproduct='',
   9:        @provider='SQLOLEDB',
  10:        @datasrc='192.168.10.76'   -- 要访问的服务器
  12:  
  13:  EXEC sp_addlinkedsrvlogin
  14:       'demodb', -- 被访问的服务器别名
  15:       'false',
  16:       NULL,
  17:       'Test', -- 帐号
  18:       'RemoteDB' -- 密码

如上我们首先清除已经可能创建服务器数据记录. 然后创建服务器连接.sp_addlinkedSrvlogin系统存储过程用来创建链接服务器上远程登录之间的映射 . 即我们可以详细设置本地与远程服务器详细的映射信息. 例如设置我们特定用户访问的用户名和密码.

查询数据:

   1:  -- 查询指定用户Test数据
   2:  select * from [demodb].CustomerDB.dbo.Users -- [如上测试成功]
查询结果:
2010-09-09_120510

 

 

 

 

 

 

指定用户Test对CustomerDB访问数据方式测试成功.

<3>问题排查与更多查询方式

 

当我们在实际编程中进行访问远程数据时 因为不同操作环境会引发各种各样的异常,如下我会提出一种常见的异常方式解决办法和关于远程数据操作更多查询方式.

<3.1>无法建立远程连接

其实这个问题在做分布式查询时极其常见. 而引起这个问题的因素过多. 我们一时无法判断真正引发这个异常地方. 只能通过逐个排查方式来进行设置:

例如我们在建立关联关系后 进行查询时会遇到:

2010-09-09_133411

 

 

 

 

提示是: 在进行远程连接时超时, 引起这个问题原因可能是远程服务器积极拒绝访问!

首先要在Sql Server Configuation Manager中保证你服务已经运行 且是开机自动运行.

再次检查SQl2005外围配置DataBaseEngine允许远程连接:

2010-09-09_133756

 

 

 

 

 

 

 

 

 

 

 

 

 

 

设置完成后.我们还需要设置Sql Server Analysis Services分析服务也支持远程数据查询:

2010-09-09_134058

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在远程服务器上如果启用了防火墙则可能对目前SQl Server方位实例进行拦截. 所以在服务器端启用防火墙情况下要为SQl DAtaBase创建例外.防止客户端请求被拦截.

<3.2>进程被其他用户占用

当我们在远程分布式查询中有创建动作或是类似创建一个新的数据库. 有时会提示 “该数据库无法操作 已经别其他进程占用”异常. 导致我们无法访问数据库. 或是执行我们要做的创建操作.

遇到这种情况我们可以利用SA权限查询到Master数据库对应数据库被占用的进程 并杀掉Kill Process.查询:

   1:  -- [sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。
   2:  -- 这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中]
   4:  use Master
   5:  go

   7:  SELECT * FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='CustomerDB'

   9:  select * from sysprocesses

  11:  select * from sysdatabases

  13:  -- 杀死占用进程
  14:  kill 5

 

当我们对进程占用清除时有可能访问数据库被系统进程占用. 则这时用Sa无法杀死.这时提示:

2010-09-09_134851

 

 

 

 

“Only use Process can be Kill ”在SQl2005 只有只有用户进程才能Kill掉.

<3.3>更多的查询操作

往往我们在实际操作中需要对数据读写有更多要求. 例如从远程连接多个服务器进行数据读取或是把本地数据提交到服务器上. 为了提高效率和性能采用分布式事务来进行批量操作等等. 如下简单介绍在分布式查询中多中数据操作:

把远程数据导入本地:

   1:  -- 导入数据操作
   2:  select top(3) * into TestDB.dbo.CopyDb from  [192.168.10.76].wl.dbo.Users

 

导入时使用Into方式 自动在本地创建CopyDB表完全复制远程服务器上Users表的数据结构.但是要注意在进行后 的CopyDB将不包含原表的主键和索引约束. 虽然能快构建 但是主键和索引设置都会丢失.

本地数据导入远程:

-- 把本地表导入远程表 [openWset方式]
 insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)  select *from 本地表 
-- 把本地表导入远程表 [open Query方式]
 insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')

更新本地表数据:

   1:  -- 把本地表导入远程表 [opendataSource方式]
   2:    insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
   3:  
   4:  -- 更新本地表 [openowset方式]
   5:   update b  set b.列A=a.列A  from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
   6:   as a inner join 本地表 b  on a.column1=b.column1

 

当然还有更多方式来操作分布式查询操作.各位都可以尝试.

 

<4>尾 语

 

如上是我最近在项目中处理关于分布式查询涉及到方方面面. 从系统架构到分部是查询具体操作细节.基本都是一些非常基础运用.当然也参考不少资料.以及动手来验证整个过程出现问题原因所在. 篇幅有限 写的有些仓促. 难免有纰漏地方 还望各位指正.

SqlServer2008 跨服务器同步数据 - 小丑不戴面具 - 博客园

mikel阅读(867)

来源: SqlServer2008 跨服务器同步数据 – 小丑不戴面具 – 博客园

最近工作中需要跨服务器同步数据,在数据库DB1中的表T1插入数据,同时触发T1的触发器(这里暂不讨论触发器的效率问题),向另一台服务器DB2中的相同的一张表T2插入数据,查看了一些资料说,

需要打开DTC(分布式交易协调器)协调跨多个数据库、消息队列、文件系统等资源管理器的事务,

于是按照网上说的,将自己的DTC打开启动,步骤如下:

DTC位置:控制面板--管理工具--服务--Distributed Transaction Coordinator

然后在本机SQLServer里新建一个触发器测试了一下,提示“该伙伴事务管理器已经禁止了它对远程/网络事务的支持”

出现这个问题的原因是对方电脑没有配置好DTC,所以需要将另一台服务器也做如下配置:

两台服务器电脑做如下配置(windows2003系统):

2. 单击“添加/删除 Windows 组件”。
3. 选择“应用程序服务器”,然后单击“详细信息”。
4. 选择“启用网络 DTC 访问”,然后单击“确定”。
5. 单击“下一步”;单击“完成”。
6. 在”开始”->”运行”中输入dcomcnfg.exe启动”组件服务”。
7. 右键“我的电脑”->“属性”,在MSDTC选项卡中,点击“安全配置”按钮。
8. 在安全配置窗口中做如下设置:
(1)选中“网络DTC访问”
(2)在客户端管理中选中“允许远程客户端”“允许远程管理”
(3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”
(4)保证DTC登陆账户为:NT Authority\NetworkService
(5)单击”确定”。这样将会提示您”MS DTC 将会停止并重新启动。
所有的依赖服务将被停止。请按’是’继续”。单击”是”继续。

 

 

我当时先拿同事的电脑做了下测试,同事的系统是Win7,按上面的步骤没有找到“应用程序服务器”,需要按下面的方法操作:

Vista, Windows 7,Windows Server 2008 MSDTC配置
1. 打开“控制面板(Control Panel)―管理工具(Administrative Tools)―组件服务(Component
Service)”(或者开始-运行 “Dcomcnfg.exe”)

2. 打开“组件服务(Component Service)―计算机(Computers)”

3. 在“我的电脑(My Computer)”上点击右键,点击“属性(Properties)”

4. 在Local DTC Properties对话框中,点击“安全(Security)”选项卡。      在安全配置选项卡中做如下设置:

选中“网络DTC访问(Network DTC Access)”   在客户端管理(Client and Administration)中选中“允许远程客户端(Allow remote Clients)”
和“允许远程管理(Allow Remote Administration)”
在事务管理通讯(Transaction Manager Communication)中选“允许入站(Allow
Inbound)”“允许出站(Allow Outbound)”“不要求进行验证(No Authentication Required)”
保证DTC登陆账户为:NT Authority\Network Service

再次测试出现提示:“其他会话正在使用事务的上下文”,这是因为对方服务器表中也有触发器,需要进行一下判断。

********************************当两台服务器不在一个网段的时候,还有可能出现一个问题*******************************

如果两台服务器在一个网段的时候,按上面的设置,基本就可以搞定了,但是当两台服务器不在一个网段的时候,SQLServer还有可能报下面的错误:

链接服务的OLE DB 访问接“SQLNCLI10”返回了消息“该事务管理已经禁止了它对远程事务的支持”

然后我对要请求访问的服务器A做了以下操作,修改A服务器的host文件,增加B的IP地址和服务器名,然后问题就解决了。

 

下面给出测试的例子:

复制代码
--创建测试表
CREATE TABLE [dbo].[TB1](
    [id] [int] NULL,
    [age] [money] NULL
) ON [PRIMARY]

GO

--创建链接服务器 
exec sp_addlinkedserver   'it38 ', ' ', 'SQLOLEDB ', '172.16.3.38' --对方服务器地址
exec sp_addlinkedsrvlogin  'it38 ', 'false ',null, 'sa', 'sa' --对方服务器用户名密码
--删除创建的链接服务器时使用
--exec sp_dropserver  'it38 ', 'droplogins ' 
--为表TB1创建触发器
CREATE TRIGGER [dbo].[tr_qiao] on [dbo].[TB1]
FOR INSERT
AS
BEGIN
  SET NOCOUNT ON
  SET XACT_ABORT ON 
 INSERT INTO it38.[数据库名].dbo.TB1(id,age) 
  SELECT id, age FROM inserted;
END
GO

--***********************************************
--查询对方数据库表数据
SELECT * FROM it38.[数据库名].[dbo].[TB1]
--插入一条数据测试
INSERT INTO TB1(id,age) values(5,55);
复制代码

 

c#中使用log4net工具记录日志 - 吃馒头的火鸡 - 博客园

mikel阅读(986)

来源: c#中使用log4net工具记录日志 – 吃馒头的火鸡 – 博客园

首先,去官网下载log4net工具 链接http://logging.apache.org/log4net/download_log4net.cgi

目前最新的版本 log4net-1.2.15-bin-newkey.zip

下载之后,目录log4net-1.2.15-bin-newkey\log4net-1.2.15\bin\net\4.0\release 里面的log4net.dll就是我们要引用的dll了。

新建一个winform程序,添加引用

然后在程序配置文件App.conifg中加入配置,这里要申明的一点是,不是一定要把log4net的配置放在这个文件里,重新创建一个xml文件也是可以的,一会儿将在下面说到。

我配置得比较简单,需要进行复杂配置的朋友可以去参照他给的示例xml,里面有注释。配置文件App.config如下:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>

<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler”/>
</configSections>
<startup>
<supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.5″ />
</startup>
<log4net>

<logger name=”ErrorLog”>
<level value=”ALL” />
<appender-ref ref=”ErrorAppender” />
</logger>
<appender name=”ErrorAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”log\\ErrorLog\\”/>
<appendToFile value=”true”/>
<rollingStyle value=”Date”/>
<staticLogFileName value=”false” />
<datePattern value=”_yyyyMMdd&quot;.txt&quot;”/>
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%-d{yyyy-MM-dd HH\:mm\:ss} – %p%n%m%n%n”/>
</layout>
</appender>
</log4net>
</configuration>

值得注意的是,一个log需要有一个对应的appender。appender中可以配置日志的格式啊,追加日志的方式啊等等。

然后有一点需要特别注意的就是。一定要在Properties中的AssemblyInfo.cs中添加一行:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

这里回答一下上面的问题。在这一行配置中,是可以配置log4net的配置文件位置的,如果像上面一样,就是程序默认的配置文件App.config中读取配置信息,如果你想写在其他地方,单独写一个xml,比如要写在最终生成的exe同级目录下的log4net.xml中,那么这一行就该这么写

[assembly: log4net.Config.XmlConfigurator(ConfigFile = “log4net.xml”, Watch = true)]

注意watch=true是必须的,否则程序就不会对这个进行监听,换个意思,这里可以做开关日志记录的操作。

然后配置完成。看效果。

我们添加一个按钮,直接来看效果:

然后在这个按钮的点击事件中:

private void button1_Click(object sender, EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger(“ErrorLog”);
log.Error(“日志测试”);
}

这里略加提醒,这个ErrorLog是在配置文件中配置的logger的name属性,不可以胡乱写,不然程序会找不到那个logger。另外,可以在配置文件中配置各种logger,很多logger,比如业务方面的,数据库方面的,错误信息,换一个logger名字和对应的Appender的名字就可以了。

然后点击按钮。按照代码,应该写一个错误日志,日志内容是“日志测试”,我们去看看结果。

从上图可以看到,在Debug目录新建了一个文件夹log,点击进去

这里这个文件夹就是在配置文件中配置的logger名称了,你配置了多个logger,这里就会有多个对应的文件夹,

这个日志文件的名字格式也是在对应的appender 中可以配置的,打开txt文件:

成功!!!同理,这里所有的格式,都是可以配置的。赶快去使用吧。

 

 

总结一下需要注意的点:

1、配置文件一个logger要有一个对应的appender,这个appender可以决定日志的名字,格式,写入方式等等。

2、配置好以后一定不要放了去Properties中的AssemblyInfo.cs中添加一行:[assembly: log4net.Config.XmlConfigurator(Watch = true)],如果你的配置不是写在程序默认配置文件中的,这里要设置好文件的路径,具体例子看上面正文。要关掉日志,Wacth=false即可。不用去程序中注释原来所有的日志代码。