posts - 17,  comments - 6,  trackbacks - 0
birt 集成到 weblogic 9中,老是出现问题:

java.lang.NoSuchMethodError: org.mozilla.javascript.ImporterTopLevel.initStandar
dObjects(Lorg/mozilla/javascript/Context;Z)V
at org.eclipse.birt.core.script.ScriptContext.<init>(ScriptContext.java:
81)
at org.eclipse.birt.report.engine.executor.ExecutionContext.<init>(Execu
tionContext.java:248)
at org.eclipse.birt.report.engine.api.impl.EngineTask.<init>(EngineTask.
java:118)
at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.<init>(RunAn
dRenderTask.java:54)
at org.eclipse.birt.report.engine.api.impl.ReportEngineHelper.createRunA
ndRenderTask(ReportEngineHelper.java:215)
at org.eclipse.birt.report.engine.api.ReportEngine.createRunAndRenderTas
k(ReportEngine.java:258)



google后,发现两个解决方案,

一、替换weblogic.jar中的js.jar文件,
麻烦,有隐串



二、在 web应用中加入
<prefer-web-inf-classes>true</prefer-web-inf-classes>

导致应用无法发布成功。


最后自己想出一种方案:
在weblogic的应动域目录中,setDomainEnv.cmd文件中, 更改如下:

@REM SET THE CLASSPATH

set CLASSPATH=%WL_HOME%\server\lib\mysql5.jar;%WL_HOME%\server\lib\js.jar;%PRE_CLASSPATH%;%WEBLOGIC_CLASSPATH%;%POST_CLASSPATH%;%WLP_POST_CLASSPATH%


将js.jar 文件复制到 server/lib目录中。在类路径中设置优先载入。

pdf电子书下载   soa.hntky.com

posted @ 2008-05-29 16:56 风中的舞者 阅读(2535) | 评论 (3)编辑 收藏
向大家推荐一下java pdf下载的网站(全英文章)
http://soa.hntky.com
posted @ 2008-03-04 13:01 风中的舞者 阅读(345) | 评论 (0)编辑 收藏

soa.hntky.com
很多的电子书,速度较快,可以搜索

posted @ 2007-05-25 08:36 风中的舞者 阅读(911) | 评论 (1)编辑 收藏

 


int     ret      
string filename
string filename2
string resume

filename
= " d:\smis2\xmk.xls "
filename2
= " d:\smis2\2006050120xmk.xls "
resume
= " d:\smis2\resume.xlw "
filedelete(resume)
oleobject    xlapp,xlsub     
xlapp
= create oleobject
ret
= xlapp.connecttonewobject( " excel.sheet " )   
// ret=xlapp.connecttonewobject("excel.application")   

if     ret < 0     then      
             messagebox(
" 你的电脑未安装Excel " ,string(ret))      
             
return       
end    
if       
xlapp.application.workbooks.open(filename)      
xlsub
= xlapp.application.activeworkbook.worksheets[ 1 ]      

xlsub.cells[
4 , 2 ].value = " 我是吴吴 "

xlapp.saveas(filename2,
true )
messagebox(
" aa " , " aa " )
xlapp.application.save(
'   ' )
// xlapp.application.close()
xlapp.application.quit()
xlsub.disconnectobject()
xlapp.disconnectobject()
destroy xlsub
destroy xlapp

posted @ 2006-10-20 10:09 风中的舞者 阅读(737) | 评论 (0)编辑 收藏
     摘要: Introducing the JavaMail API The JavaMail API is an optional package (standard extension) for reading, composing, and sending electronic messages. You use the package to create Mail User Agent ...  阅读全文
posted @ 2006-10-20 09:01 风中的舞者 阅读(314) | 评论 (0)编辑 收藏

Javamail操作指南(二)

作者:Bromon 来源:http://blog.itpub.net (2005-06-28 13:30:54)


 

怎样才算比较完整的Javamail操作指南?我想应该包括绝大多数基本的email操作,能够应付一般的应用。在本指南中打算囊括以下内容:

 ● 发送email:包括文本邮件、HTML邮件、带附件的邮件、SMTP验证
 ● 接收email:pop3远程连接、收取不同MIME的邮件、处理附件

 我想有了上述功能的介绍,应该可以应付很多email的相关应用了。所以请允许我给本文拟了一个比较狂妄的名字,这样才能保证收视率,。还是那句话,写这个post的原因就是没有在网上看到更全面的,你看过的话记得要告诉我。

  下面的所有例子都经过实际测试,你可以说它写得不够OO,不够plugable,但是它的确是可以参考的。自从有了javamail,发垃圾邮件就方便多了。本文代码多说明少,这倒不是我偷懒,而是很多东西都涉及pop3等协议的规范,如果不了解这些规范的话,由的东西我实在不知道怎么跟你解释;如果了解的话,那我基本上就不用再解释。所以本着实用的原则就省略了,由兴趣的话自己去翻翻协议规范。

 废话少说,首先需要配置环境。需要的包是mail.jar和activation.jar。高版本的J2SDK EE自带。地址嘛,再java.sun.com上搜索一下,很容易找到。放到classpath中就KO。

 一、 邮件的发送

 下面了弄个发邮件的Hello World,热热身:

 /*************
 Name:TextMailSender.java
 Author:Bromon
 Version:1.0
 Date:2004-4-26
 Note:发送email到bromon@163.com,需要安装SMTP服务器
 *************/
 package org.bromon.mail;
 import javax.mail.*;
 import javax.mail.internet.*;
 import java.util.*;
 public class TextMailSender
 {
 public static void main(String args[])
 {
  try
  {
   Properties prop=new Properties();
   //指定要使用的SMTP服务器为bromon2k
   prop.put("mail.smtp.host","bromon2k");
   Session mailSession=Session.getDefaultInstance(prop);

   //发件人地址
   InternetAddress from=new InternetAddress("bromon@bromon2k");
   //收件人地址
   InternetAddress to=new InternetAddress("bromon@163.com");
   
   MimeMessage msg=new MimeMessage(mailSession);
   msg.setFrom(from);
   msg.addRecipient(javax.mail.Message.RecipientType.TO,to);
   //发信日期
   msg.setSentDate(new java.util.Date());
   //title
   msg.setSubject("你好");
   //邮件正文
   msg.setText("hello,bromon");
   Transport.send(msg);
  }catch(Exception e)
  {
   System.out.println(e);
  }
 }
 } 


  程序很简单,但是它是不能运行的(倒)。除非你的机器上安装了一个SMTP服务器,而且你的机器还叫做bromon2k。写这么一段不能执行的程序不是为了找打,而是让各位对javamail有个基本印象,我就懒得改了。下面演示的是如何通过163、sohu等email服务商提供的免费邮箱来发邮件,基本操作和上面的一样,只是多一个SMTP验证而已:

 /*
 * Created on 2004-4-26
 */
 package org.bromon.mail;
 import javax.mail.*;
 import java.util.*;
 import javax.mail.internet.*;

 /**
 * @author Bromon
 */
 public class SenderWithSMTPVer
 {
 String host="";
 String user="";
 String password="";

 public void setHost(String host)
 {
  this.host=host;
 }

 public void setAccount(String user,String password)
 {
  this.user=user;
  this.password=password;
 }

 public void send(String from,String to,String subject,String content)
 {
  Properties props = new Properties();
  props.put("mail.smtp.host", host);//指定SMTP服务器
  props.put("mail.smtp.auth", "true");//指定是否需要SMTP验证
  try
  {
   Session mailSession = Session.getDefaultInstance(props);
   
   mailSession.setDebug(true);//是否在控制台显示debug信息
   
   Message message=new MimeMessage(mailSession);
   message.setFrom(new InternetAddress(from));//发件人
   message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//收件人
   
   message.setSubject(subject);//邮件主题
   message.setText(content);//邮件内容
   message.saveChanges();
   
   Transport transport = mailSession.getTransport("smtp");
   transport.connect(host, user, password);
   transport.sendMessage(message, message.getAllRecipients());
   transport.close();
  }catch(Exception e)
  {
   System.out.println(e);
  }
  
 }

 public static void main(String args[])
 {
  SenderWithSMTPVer sm=new SenderWithSMTPVer();

  sm.setHost("smtp.163.com");//指定要使用的邮件服务器
  sm.setAccount("abc","123");//指定帐号和密码

  /*
 * @param String 发件人的地址
   * @param String 收件人地址
   * @param String 邮件标题
   * @param String 邮件正文
  */
  sm.send("abc@163.com","bromon@163.com","标题","内容");
 }

 } 


 这段程序好像也不需要解释了吧,把SMTP地址、帐号、密码等配置信息写到Properties里面,Java里面很多API都需要这么干,比如再程序中加入对代理服务器的支持等。

 上面的程序修改一下服务器地址、帐号、密码就可以使用,非常简单。

 如何发送一个HTML格式的Email呢?也很简单,再邮件正文中写入HTML代码,然后指定邮件的ContentType就OK,下面只给出关键代码:

 ………..
 MimeMessage msg=new MimeMessage(mailSession);
 msg.setContent(content,"text/html");
 msg.setText(“<html><body><h1>下面的,你们好吗?</body></html>”);
 ………..

 下面是发送带有附件的email,稍微复杂一点,而且和前面的程序有一些不同,请仔细一点,同时需要一点IO的知识。相同的代码就不在列出,只写关键部分,谁都想偷懒不是?

 import javax.mail.*;
 import javax.mail.internet.*;
 import javax.activation.*;
 import java.util.*;
 ……….
 MimeMessage msg=new MimeMessage(mailSession);
 msg.setSentDate(new Date());
 msg.setSubject("hello");

 MimeBodyPart textBodyPart=new MimeBodyPart();
 textBodyPart.setText(“邮件正文”);

 MimeBodyPart fileBodyPart=new MimeBodyPart();
 FileDataSource fds=new FileDataSource("GIS.rar");//要发送的附件
 fileBodyPart.setDataHandler(new DataHandler(fds));
 fileBodyPart.setFileName(fds.getName());
 Multipart container=new MimeMultipart();
 container.addBodyPart(textBodyPart);
 container.addBodyPart(fileBodyPart);
 msg.setContent(container);
 Transport.send(msg);
 ………… 


 这里的msg由两个MimeBodyPart构成,这个东西解释起来基本上比较难,如果不了解相关的规范就不太好解释,如果了解的话,我就不用解释了,这个这个………唉。

二、 邮件的收取

 通常情况下我们都使用pop3协议来收邮件,IMAP嘛现在就不涉及了。收邮件的功能虽然我用了很多时间才基本搞清楚,不过讲起来就so easy了,一个程序就可以基本包括。

 邮件大致可以分三种:纯文本邮件、含有其他数据的文本邮件、含有附件的邮件。


 CODE  
 /*
 * Created on 2004-4-26
 */
 package org.bromon.mail;
 import javax.mail.*;
 import java.util.*;
 import java.io.*;

 /**
 * @author Bromon
 */
 public class Receiver
 {
 Folder inbox;
 Store store;

 //连接邮件服务器,获得所有邮件的列表
 public Message[] getMail(String host,String name,String password) throws Exception
 {
  Properties prop=new Properties();
  prop.put("mail.pop3.host",host);
  Session session=Session.getDefaultInstance(prop);
  store=session.getStore("pop3");
  store.connect(host,name,password);
  
  inbox=store.getDefaultFolder().getFolder("INBOX");
  inbox.open(Folder.READ_ONLY);
  
  Message[] msg=inbox.getMessages();
  
  FetchProfile profile=new FetchProfile();
  profile.add(FetchProfile.Item.ENVELOPE);
  inbox.fetch(msg,profile);
  
  return(msg);
 }

 //处理任何一种邮件都需要的方法
 private void handle(Message msg) throws Exception
 {
  System.out.println("邮件主题:"+msg.getSubject());
  System.out.println("邮件作者:"+msg.getFrom()[0].toString());
  System.out.println("发送日期:"+msg.getSentDate());
 }

 //处理文本邮件
 public void handleText(Message msg) throws Exception
 {
  this.handle(msg);
  System.out.println("邮件内容:"+msg.getContent());
 }

 //处理Multipart邮件,包括了保存附件的功能
 public void handleMultipart(Message msg) throws Exception
 {
  String disposition;
  BodyPart part;
  
  Multipart mp=(Multipart)msg.getContent();
  int mpCount=mp.getCount();//Miltipart的数量,用于除了多个part,比如多个附件
  for(int m=0;m<mpCount;m++)
  {
   this.handle(msg);
   
   part=mp.getBodyPart(m);
   disposition=part.getDisposition();
   if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判断是否有附件
   {
    //this.saveAttach(part);//这个方法负责保存附件,注释掉是因为附件可能有病毒,请清理信箱之后再取掉注释
   }else{
    System.out.println(part.getContent());
   }
  }
 }

 private void saveAttach(BodyPart part) throws Exception
 {
  String temp=part.getFileName();//得到未经处理的附件名字
  String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
  
  //文件名一般都经过了base64编码,下面是解码
  String fileName=this.base64Decoder(s);
  System.out.println("有附件:"+fileName);
  
  InputStream in=part.getInputStream();
  FileOutputStream writer=new FileOutputStream(new File(fileName));
  byte[] content=new byte[255];
  int read=0;
  while((read=in.read(content))!=-1)
  {
   writer.write(content);
  }
  writer.close();
  in.close();
 }

 //base64解码
 private String base64Decoder(String s) throws Exception
 {
  sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
  byte[] b=decoder.decodeBuffer(s);
  
  return(new String(b));
 }

 //关闭连接
 public void close() throws Exception
 {
  if(inbox!=null)
  {
   inbox.close(false);
  }
  
  if(store!=null)
  {
   store.close();
  }
 }

 public static void main(String args[])
 {
  String host="pop.163.com";
  String name="bromon";
  String password="My password";
  
  Receiver receiver=new Receiver();
  
  try
  {   
   Message[] msg=receiver.getMail(host,name,password);
   
   for(int i=0;i<msg.length;i++)
   {
    if(msg[i].isMimeType("text/*"))//判断邮件类型
    {
     receiver.handleText(msg[i]);
    }else{
     receiver.handleMultipart(msg[i]);
    }
    System.out.println("****************************");
   }
   receiver.close();
  }catch(Exception e)
  {
   System.out.println(e);
  }
 }
 } 


  没有习惯读java代码的兄弟可能会觉得麻烦了一点,其中有个小问题,下载的附件会再文件名后面加上一个”#”符号,不知道这是javamail的特别处理还是pop3的规范。通过程序更改文件名很简单,就不说了。对于email还有很多其他的操作,可以自己取查看一下javadoc,我就不影响大家探索的乐趣了。在Properties里配置代理服务器,可以让程序通过代理收发邮件,一般的HTTP、socks 4、socks 5都支持。

posted @ 2006-10-19 16:10 风中的舞者 阅读(383) | 评论 (0)编辑 收藏
http://www.dokeos.com/howto.php
posted @ 2006-09-19 20:51 风中的舞者 阅读(369) | 评论 (0)编辑 收藏
s
posted @ 2006-08-12 17:26 风中的舞者 阅读(351) | 评论 (1)编辑 收藏
在CMP实体BEAN中使用BLOB数据类型
2005-07-19   来源:matrix.org.cn  作者:matrix.org.cn
摘要:
在Oracle这样的关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。JDBC定义java类型java.sql.Clob 和java.sql.Blob 对应数据库中的CLOB和BLOB类型。然而这两种类型并不能在实体BEAN中使用,因为这两个类没有被序列化(Serializable)。因此我们不能在CMP实体BEAN中定义java.sql.Clob或java.sql.Bl


在Oracle这样的关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。

JDBC定义java类型java.sql.Clob 和java.sql.Blob 对应数据库中的CLOB和BLOB类型。然而这两种类型并不能在实体BEAN中使用,因为这两个类没有被序列化(Serializable)。因此我们不能在CMP实体BEAN中定义java.sql.Clob或java.sql.Blob这两种数据类型。

如果我们要使用数据库的BLOB字段,我们必须在实体bean中声明CMP字段为 byte[] 并映射该字段到数据库的BLOB字段。如果要使用CLOB字段,我们需要使用定义CMP字段为 java.lang.String or char[] 。

一个ENTITY的范例
在一个企业里,处于安全考虑,我们也许要将员工的图片保存到数据库中的表里。这里我们使用EmployeePicture 作为范例来代表员工的图片实体。这个EmployeePictureBean CMP有两个属性 empno, picture。 picture 字段被定义成byte[]型 。

该EmployeePicture实体BEAN被映射到EMPPIC数据表, picture 属性被映射为EMPPIC 表中的picture 字段,该picture字段是定义为BLOB类型的。

下面是EmployeePictureBean.java的部分核心代码:

public abstract class EmployeePictureBean implements EntityBean
{
  ....
  public abstract byte[] getPicture();
  public abstract void setPicture(byte[] newPicture);
  public Long ejbCreate(Long empno, byte[] newPicture)
  {
    setEmpno(empno);
    setPicture(newPicture);
    return empno;
  }

  public void ejbPostCreate(Long empno, byte[] newPicture)
  {
  }
  ...
}


如果我们使用OC4J 9.0.4 ,就需要在orion-ejb-jar.xml中定义实体BEAN属性到数据表字段的映射。如果使用了其他J2EE容器,就需要在相关厂商的部署描述符中定义O-R映射。下面演示在OC4J中的映射代码:

<entity-deployment name="EmployeePicture" data-source="jdbc/OracleDS" table="EMPPIC">
  <primkey-mapping>
    <cmp-field-mapping name="empno" persistence-name="EMPNO" persistence-type="NUMBER(8)"/>
  </primkey-mapping>
  <cmp-field-mapping name="empno" persistence-name="EMPNO" persistence-type="NUMBER(8)"/>
  <cmp-field-mapping name="picture" persistence-name="PICTURE" persistence-type="BLOB"/>
</entity-deployment>



客户端:
CMP实体BEAN的客户端没有什么特别的处理。唯一需要注意的是在update数据表时要使用BufferedInputStream 来读取IMAGE文件,但在检索数据表时使用OutputStream 。

下面演示如何读取一个IMAGE文件,并创建一个BEAN实例:

 // Locate and open the file

    File imgFile = new File(fileName);

    long imgFileSize= imgFile.length();

    // initialize the byte array

    byte byteValue[] = new byte[(int)imgFileSize];

    // Read the file into the byte array

    InputStream is = new BufferedInputStream(new FileInputStream(imgFile));

    int len = is.read(byteValue);

    //Add the byte to the entity bean field

    if(len!=imgFileSize)

    {

           System.out.println("Read bytes did not equal file size on directory");

    }

    else

    {

      EmployeePictureLocal employeePicture = empHome.create(empNo , byteValue);

posted @ 2006-06-19 23:51 风中的舞者 阅读(290) | 评论 (0)编辑 收藏
weblogic.jdbc.oracle.OracleDriver

在weblogic 的控制台下建的连接池,数据源在workshop中无法建实体bean,
但在workshop中的却可以。关键就是要修改驱动程序如上。
posted @ 2006-06-17 08:58 风中的舞者 阅读(215) | 评论 (0)编辑 收藏

http://www.onlinedown.net/soft/40251.htm

posted @ 2006-03-27 21:08 风中的舞者 阅读(213) | 评论 (1)编辑 收藏

在routeros中,每一个ppoe用户拨号成功后,都会在服务器上产生一个接口。我们可以在防火墙中阻挡掉对原来数据的转发,
iptables -A FORWARD -i ether1 -j DROP
从而要求用户必须拨号上网

或者只对ppoe客户的地址段进行nat masqu....。只对其地址池。我想没有拨号的,私自设置地址应不可上网。

posted @ 2006-03-21 20:25 风中的舞者 阅读(239) | 评论 (0)编辑 收藏
将common-loggin.jar log4j.jar 放到 common\lib下
将log4j.properties 放在 shared\classes 下
posted @ 2006-02-15 22:25 风中的舞者 阅读(486) | 评论 (0)编辑 收藏
http://www.ipointportal.com
posted @ 2005-11-27 15:07 风中的舞者 阅读(135) | 评论 (0)编辑 收藏

http://www.uportal.org

posted @ 2005-11-24 11:25 风中的舞者 阅读(153) | 评论 (0)编辑 收藏
http://www.sakaiproject.org/
About Sakai

The Sakai Project is a community source software development effort to design, build and deploy a new Collaboration and Learning Environment (CLE) for higher education. The Project began in January, 2004.

Goals
The Sakai Project's primary goal is to deliver the Sakai application framework and associated CMS tools and components that are designed to work together.  These components are for course management, and, as an augmentation of the original CMS model, they also support research collaboration.  The software is being designed to be competitive with the best CMSs available.

The tools are being built by designers, software architects and developers at different institutions, using an experimental variation of an open source development model called the community source model (see below).  To provide a support system for institutions that want to be involved in the Sakai Project, either by adopting Sakai tools or by developing tools for inter-institutional portability, the Sakai Project  has also formed the Sakai Educational Partners Program (SEPP) and the Sakai Commercial Affiliates Program.

Origins
The Sakai Project has its origins at the University of Michigan and Indiana University, where both universities independently began open source efforts to replicate and enhance the functionality of their existing CMSs .  Soon after, MIT and Stanford joined in and, along with the Open Knowledge Initiaitive (OKI) and the uPortal consoritum, and a generous grant from the Mellon Foundation, they formed the Sakai Project. 

Community Source Development Model
The Sakai Project follows what is called the community source model, which is an extension to the already successful, economically feasible, open source movement forged by projects such as Apache, Linux, and Mozilla. Based on the goal of addressing the common and unique needs of multiple institutions. community source relies more on defined roles, responsibilities, and funded commitments by community members, than some open source development models.

Current Progress
To date, the Sakai Project has put out three major software releases (1.0, 1.5 and 2.0), developed an Educational Partner's Program which now has around  80 members around the world with 14+ active discussion groups  and five commercial affiliates, organized three highly successful SEPP conferences,  and successfully demonstrated a  model for community source software development among colleges and universities.  

Future
In the future, the Sakai Project expects to continue its effort to build out its interoperable framework and develop many new tools and extensions. In addition, the Partner's Program will continue to grow and the development model used for Sakai is expected to become more broadly applicable.

posted @ 2005-11-24 11:24 风中的舞者 阅读(805) | 评论 (0)编辑 收藏

Backup your Linux System | 备份你的 Linux 系统

Author | 作者 : Kreny

Abstract: Backup your data in Linux system by using shell commands, OpenSSH, etc.

摘要: 本文结合个人粗浅的 Linux 经验, 阐述如何使用 shell 命令以及 OpenSSH 等工具备份 Linux 系统和数据。

一、我们需要备份什么?

我的 Linux 系统是基于 Redhat 的Redhat Linux 9.0,同时配置了诸如 MySQL、PHP、Apache 等基础服务,同时又配有 Awstats、MRTG、MT 等应用服务程序,因此,我们需要备份的除了系统本身的重要文件以外,还需要备份数据库、log文件和统计数据文件等。当然另外一项必不可少的就是编译各项服务时的 ./configure 参数,这里就不赘述了。

二、制定备份文件列表。

这个步骤就是归纳一下需要备份的目录列表。以下我就依照我所安装的各项服务作了一个简单的list。 一些文件的地址是以我的服务器为标准(以"/"开头),一些则以相对目录来描述(以"./"开头)。

系统:

  • /etc /usr/local/etc
    包含所有核心配置文件。这其中包括网络配置、系统名称、防火墙规则、用户、组,以及其他全局系统项。
  • /var
    包含系统守护进程(服务)所使用的信息,包括 DNS 配置、DHCP 租期、邮件缓冲文件、HTTP 服务器文件、db2 实例配置,等等。
  • /home
    包含所有用户的默认用户主目录。这包括他们的个人设置、已下载的文件和用户不希望失去的其他信息。
  • /root
    是根(root)用户的主目录。
  • /opt
    是安装许多非系统文件的地方。IBM 软件就安装在这里。OpenOffice、JDK 和其他软件在默认情况下也安装在这里。

    系统中不需要备份的目录:

  • /proc
    应该永远不要备份这个目录。它不是一个真实的文件系统,而是运行内核和环境的虚拟化视图。它包括诸如 /proc/kcore 这样的文件,这个文件是整个运行内存的虚拟视图。备份这些文件只是在浪费资源。
  • /dev
    包含硬件设备的文件表示。如果计划还原到一个空白的系统,那就可以备份 /dev。然而,如果计划还原到一个已安装的 Linux 系统,那么备份 /dev 是没有必要的。

    更多关于目录的解释,请查看 Filesystem Hierarchy StandardRed Hat Linux Overview of File System Hierarchy Standard (FHS)

    MySQL:

  • /usr/local/mysql
    同时要注意版本的保留,在恢复的时候使用相同的版本(或者相同系列的版本)会减少更多不必要的麻烦,例如 “/usr
    /local/mysql-standard-4.1.7-pc-linux-i686”。
  • /etc/my.cnf
    MySQL 的配置文件。

    Apache:

  • /usr/local/apache2/logs
    Apache 的 log 文件。这里建议使用 cronolog 来 rotate Apache 的巨大 log。可以参考我的 cronolog 杂记
  • /usr/local/apache2/conf
    Apache 的配置文件,例如: httpd.conf。还是建议在修改此文本的时候使用“#”号 comment 修改的内容,然后添加需要修改的内容。

    PHP:

  • /usr/local/lib/php.ini
    个人觉得这个就够了。如果你设定了 php 的 error log 文件,当然那个也是需要的。

    Movable Type:

  • ./MT-3.0D-full-en_ususr/ 和你的 weblog 目录
    一般来说 blog 不会太大,不介意的话就整个备份一下。当然最重要的是 ./MT-3.0D-full-en_ususr/db/ 文件夹,里面有所有的数据(如果你没有用 MySQL 作为 MT 的数据存储格式的话)。

    Awstats:
  • /etc/awstats/
    Awstats 的配置文件。诸如:awstats.blog.conf
  • /var/lib/awstats/
    Awstats 的分析留档文件。 诸如:awstats082004.blog.txt

    MRTG:

  • MRTG 的输出文件夹。内有图片和诸如 12.34.56.78_12.34.56.78.log 的log文件。

    三、使用 tar 和 crontab 等简单工具备份。

    以下是使用 tar 的脚本,去掉了多余的说明部分。 您也可以点击这里下载并修改以适合自己的系统。在脚本中我尽量用更多的方法来进行备份。在实际应用中可以将步骤更加简化。更多关于 tar 的参数请看 man tar

    #!/bin/sh

    # Date format: 20040626
    DATE=`date -d yesterday +%Y%m%d`

    # MySQL version & directory
    MYSQL_VERSION="4.x.x"
    MYSQL_DIR="/usr/local/mysql/data"

    # MT Blog directory
    MTBLOG_DIR="/path-to-mt/db/"

    # Backup directory & Backup Filelist
    BACKUP_DIR="/path-to-backup/backupfile"
    BACKUP_FILELIST="/path-to-backup/filelist"

    # Backup MySQL
    printf "Backup MySQL data directory, please wait...\n"
    tar -zpcvPf $BACKUP_DIR/mysql-standard-$MYSQL_VERSION-data-$DATE.tgz $MYSQL_DIR | grep "tar:"
    printf "Done! The new backup file is: $BACKUP_DIR/mysql-standard-$MYSQL_VERSION-data-$DATE.tgz\n\n"

    # Backup MT Blog
    printf "Backuping the MT3.0 Weblog data directory, please wait...\n"
    tar -zpcvPf $BACKUP_DIR/MT-db-$DATE.tgz $MTBLOG_DIR | grep "tar:"
    printf "Done! The new backup file is: $BACKUP_DIR/MT-db-$DATE.tgz\n"

    这里引用了『Linux 备份与恢复速成指南』中的一个小技巧,将文件列表写入一个文件进行操作。查看我的Filelist

    以下是一个文件列表的例子:

    /etc
    /var
    /home
    /usr/local
    /opt (有时会是空目录)
    以下解释引自『Linux 备份与恢复速成指南』:

    请注意 tar -T(或 files-from)命令不能接受通配符。文件必须明确地列出。上面的例子展示了一种单独地引用文件的方法。您还可以执行脚本来搜索系统,然后建立一个列表。下面就是这样一个脚本的例子:

    #!/bin/sh
    cat MyFiles > TempList
    find /usr/share -iname *.png >> TempList
    find /tmp -iname *.iso >> TempList
    tar -cpzMf /path-to-backup/backupfile -T TempList
    上面的脚本首先将 MyFiles 中的所有现有文件列表复制到 TempList。然后它执行两个 find 命令来搜索文件系统中匹配某个模式的文件,并将它们附加到 TempList。第一次是搜索 /usr/share 目录树中以 .png 结尾的所有文件。第二次是搜索 /tmp 目录树中以 .iso 结尾的所有文件。在建立好列表之后,tar 然后在文件设备 /dev/st0 (第一个 SCSI 磁带设备)上创建 一个新的归档文件,该文件使用 gzip 格式来压缩,并保留所有文件权限。该归档文件将跨越多个卷。要归档的文件的名称将从 TempList 文件中提取。

    四、适用于 log 和数据库的增量备份(incremental backup)。

    对于庞大的 log 或者 数据库文件,每天进行完全备份似乎不是很能合理高效地实现备份工作。所以在较短的时间周期内,适用增量备份(incremental backup)会是一个不错的选择。

    tar 并不是最好的增量备份工具

    tar 并不是最好的增量备份的工具,但是它也可以实现增量备份。参照 『The tar backup program』中的脚本可以实现这个操作。

    简单地介绍一下其原理:
    首先,制作一个完全备份的时间点文件,例如 "full-date"。其中写入某次完全备份的时间点,例如 echo $NOW > full-date
    然后在自定的时间循环期内(例如一周),每次和完全备份时间点(full-date)对比后进行增量备份。
    其中最关键的一个语句就是:

    tar --newer $full-date -zcpf $BACKUPDIR/$BACKUPFILE-$NOW.tgz $DIRECTOIES
    其结果就是,在一周中会产生 6 个独立文件,其内容是前一天内新增的内容。以下是一个例子:
    [root@deep] /# ls -l /backups/

    total 22217
    -rw-r--r-- 1 root root 10731288 Feb 7 11:24 deep-01Feb.tar << 每月月初一次完全备份
    -rw-r--r-- 1 root root 6879 Feb 7 11:24 deep-Fri.tar << 每天的增量备份
    -rw-r--r-- 1 root root 2831 Feb 7 11:24 deep-Mon.tar
    -rw-r--r-- 1 root root 7924 Feb 7 11:25 deep-Sat.tar
    -rw-r--r-- 1 root root 11923013 Feb 7 11:24 deep-Sun.tar << 每周一次完全备份
    -rw-r--r-- 1 root root 5643 Feb 7 11:25 deep-Thu.tar
    -rw-r--r-- 1 root root 3152 Feb 7 11:25 deep-Tue.tar
    -rw-r--r-- 1 root root 4567 Feb 7 11:25 deep-Wed.tar
    drwxr-xr-x 2 root root 1024 Feb 7 11:20 last-full

    tar 中几个开关的简介:

  • The c option specifies that an archive file is begin created.
  • The p option preserves permissions; file protection information will be remembered.
  • The N or newer option does an incremental backup and only stores files newer than DATE.
  • The f option states that the very next argument will be the name of the archive file or device being written.
  • The z option specifies that an gzip file will be created.
  • The u option can APPEND more files to a tarball file.
    注意:-u 开关并不是增量备份,而是往原有的 tar 包里面添加新的文件。

    fbackup is a better choice

    在 HP 的论坛上,有关于增量备份的讨论--“Incremental "tar" Backup in HP-Ux”。但是因为我不是 HP 的系统,tar 已经可以满足现有的备份需求。

    五、使用 ssh 实现安全网络远程备份。

    [很抱歉,此段笔者没有试验环境,现在之能添加几篇关于 ssh 远程传送的文章。等到经过试验后,我会添加具体内容。]

  • 33.8. Backing up and restoring over the network
  • 轻松进行自主的、安全的、分布式网络备份

    六、个人使用的 e-mail 简单备份。

    由于 Yahoo!、Google、Hotmail 相继推出了 1-2G 的邮箱,因此可是试着使用带有文件附件的 E-mail 来传输小于各个邮箱的单封信件上限大小的文件。 具体需要用到一些诸如 uudecode 的命令,所以需要先安装一个 Sharutils 。 我在编译中遇到一些简单的错误,这里是我修改过的 Sharutils

    在命令行下发送带附件的邮件时,还是建议使用诸如 MUTT 的 MUA,请查看我的 MUTT 的安装失败经历,也许对新装的用户有所帮助。

    安装完毕后,可以使用 Mutt 的命令行一行解决问题。首先先写一个邮件文本 mailcontent.txt。

    # cat mailcontent.txt | mutt -s "mailtitle" -a attachfile1 mail@address

    结合上面的 shell 脚本,如果你有企业级邮箱的话,不妨也试试这种方法。仅供参考。

    参考文档:

  • 『Windows 到 Linux 之旅:第 8 部分. 备份与恢复 之 Linux 备份与恢复速成指南』

  • 『在 Linux 上进行自动备份--轻松进行自主的、安全的、分布式网络备份』

  • 『在文字模式下用mail如何将文件以附件方式发送』

  • W. Curtis Preston (2003)《Unix Backup & Recovery》

  • 『Filesystem Hierarchy Standard』

  • 『Red Hat Linux Overview of File System Hierarchy Standard (FHS)』

  • Securing and Optimizing Linux - A Hands on Guide (Red Hat Edition)》 一书的 第 7 章“备份和还原”是另一份不错的指南,其中包括一个脚本,用于执行基于 tar 的增量备份(incremental backup)。

    Useful Links:

  • http://www.linux-backup.net/
  • Sharutils
  • posted @ 2005-11-12 10:37 风中的舞者 阅读(357) | 评论 (0)编辑 收藏
    <2005年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用链接

    留言簿(1)

    随笔档案

    文章档案

    java技术

    搜索

    •  

    最新评论

    阅读排行榜

    评论排行榜