分页: 109/196 第一页 上页 104 105 106 107 108 109 110 111 112 113 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Jul 30
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog:用于处理二进制日志文件的实用工具”。

要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf o my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为--log-bin。要想确定当前的二进制日志文件的文件名,输入下面的MySQL语句:
SHOW BINLOG EVENTS \G
你还可以从命令行输入下面的内容:
mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS \G'
将密码my_pwd替换为服务器的root密码。

. 指定恢复时间

对于MySQL 4..4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午0:00(今天是2006年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.23456 \
  | mysql -u root -pmypwd
该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 0:0:00" /var/log/mysql/bin.23456 \
  | mysql -u root -pmypwd \
在该行中,从上午0:0登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午0:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。

2. 指定恢复位置

也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:
mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 0:05:00" \
  /var/log/mysql/bin.23456 > /tmp/mysql_restore.sql
该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:
mysqlbinlog --stop-position="36832" /var/log/mysql/bin.23456 \
| mysql -u root -pmypwd
mysqlbinlog --start-position="36835" /var/log/mysql/bin.23456 \
| mysql -u root -pmypwd \
上面的第行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。
Tags:
Jul 30
当你连接一个MySQL服务器时,你通常应该使用一个口令。口令不以明文在连接上传输。所有其它信息作为能被任何人读懂的文本被传输。如果你担心这个,你可使用压缩协议(MySQL3.22和以上版本)使事情变得更难。甚至为了使一切更安全,你应该安装ssh。用它,你能在一个MySQL服务器与一个MySQL客户之间得到一个加密的tcp/ip连接。
为了使一个MySQL系统安全,强烈要求你考虑下列建议:
对所有MySQL用户使用口令。记住,如果other_user没有口令,任何人能简单地用Mysql -u other_user db_name作为任何其它的人登录。对客户机/服务器应用程序,客户可以指定任何用户名是常见的做法。在你运行它以前,你可以通过编辑MySQL_install_db脚本改变所有用户的口令,或仅仅Mysql root的口令,象这样:
shell> mysql -u root mysql mysql> up�ate user
set password=password("new_password")
wh�re user="root"; mysql> flush privileges;

不要作为Unix的root用户运行MySQL守护进程。mysqld能以任何用户运行,你也可以创造一个新的Unix用户MySQL使一切更安全。如果你作为其它Unix用户运行mysqld,你不需要改变在user表中的root用户名,因为Mysql用户名与unix 用户名没关系。你可以作为其它unix用户编辑mysql.server启动脚本mysqld。通常这用su命令完成。

如果你把一个Unix root用户口令放在mysql.server脚本中,确保这个脚本只能对root是可读的。
检查那个运行Mysqld的Unix用户是唯一的在数据库目录下有读/写权限的用户。

不要把process权限给所有用户。mysqladmin processlist的输出显示出当前执行的查询正文,如果另外的用户发出一个up�ate user set password=password("not_secure")查询,被允许执行那个命令的任何用户可能看得到。mysqld为有process权限的用户保留一个额外的连接, 以便一个mysql root用户能登录并检查,即使所有的正常连接在使用。不要把file权限给所有的用户。

有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了使这更安全一些,用sel�ct ... into outfile生成的所有文件对每个人是可读的,并且你不能覆盖已经存在的文件。
file权限也可以被用来读取任何作为运行服务器的unix用户可存取的文件。这可能被滥用,例如,通过使用load data装载“/etc/passwd”进一个数据库表,然后它能用sel�ct被读入。

如果你不信任你的dns,你应该在授权表中使用IP数字而不是主机名。原则上讲,--secure选项对mysqld应该使主机名更安全。在任何情况下,你应该非常小心地使用包含通配符的主机名。
Tags:
Jul 30
当您面临JSP连接MySQL数据库问题,你首先需要在MySQL数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数据。

以下用两种方式来实现JSP连接MySql数据库

第一种方式,用JSP实现:

<%@ page contentType="text/html;
charset=gb232" language="java"
import="java.sql.*"%>
<meta http-equiv="Content-Type" content="text/html; charset=gb232">
<%//*******************************
****************
JDBC_ODBC连接MySql数据库,不需要设置数据源***********
**********************/  
//********** 数据库连接代码 开始 ******/  
//以下几项请自行修改String server="localhost";        
//MYSQL 服务器的地址String dbname="test";          
//MYSQL 数据库的名字String user="root";                
//MYSQL 数据库的登录用户名String pass="chfanwsp";            
//MYSQL 数据库的登录密码String port="3306";    
//SQL Server 服务器的端口号,
默认为433//数据库连接字符串
String url ="jdbc:mysql://"+server+":"+port+"/"+dbname+"?
user="+user+"&amp;password="+pass+"&amp;useUnicode
=true&amp;characterEncoding=GB232";
//加载驱动程序Class.forName("org.gjt.mm.mysql.Driver").newInstance();
//建立连接Connection conn= DriverManager.getConnection(url);
//创建语句对象Statement stmt=conn.cr&amp;#0;ateStatement
(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// ****     数据库连接代码 结束 *******  
  String sql="sel&amp;#0;ct * from username";
ResultSet rs=stmt.executeQuery(sql);
//rs.first();while(rs.next()){out.print("用户名:");
out.print(rs.getString("uid")+" 密码:");
out.println(rs.getString("pwd")+"<br>");}
rs.close();stmt.close();conn.close();%>

第二种方式,用JavaBean来实现:

DBConnMySql.java编译以后的Class文件应该放在WEB-INF\classes\conn目录下。

package conn;    //导入包import java.sql.*;        
//导入数据库操作的类public class DBConnMySql            
//构造方法,初始化{private Connection conn;        
//连接对象private Statement stmt;    
//语句对象private ResultSet rs;    
//结果集对象private String MySqldriver;
//MYSQL Server驱动程序字符串private String MySqlURL;
//MYSQL Server连接字符串//*********************************
用  og.gjt.mm.mysql.Driver 驱动
*  该方法取得连接所需各种参数,组成连接字符串,
然后再建立连接*  server;dbname,user,pass,port
分别表示MYSQL 服务器的地址,
*  数据库,用户名,密码,端口
**********************************/
public Connection getConnToMySql
(String server,String dbname,String user,String pass,String port)
{//MYSQl驱动程序MySqldriver = "org.gjt.mm.mysql.Driver";    
MySqlURL = "jdbc:mysql://";          
//连接字符串一部分try{//完整的连接字符串MySqlURL
=MySqlURL+server+":"+port+"/"+dbname+"?user=
"+user+"&password="+pass+"&useUnicode
=true&characterEncoding=GB232";
Class.forName(MySqldriver);conn
= DriverManager.getConnection(MySqlURL);}
catch(Exception e){System.out.println
("操作数据库出错,请仔细检查");
//System.err.println(e.getMessage());}return conn;}    
//关闭数据库连接public void close(){try{//rs.close();
//stmt.close();conn.close();}catch(SQLException
sqlexception){sqlexception.printStackTrace();}}}

这个文件只是实现了数据库的连接,下面再写一个测试文件,就是用SQL语句从数据库里查询出记录,以验证我们数据库的连接是否成功。

connmysql.jsp文件源代码如下:

<meta http-equiv="Content-Type" content="text/html;
charset=gb232"><%@ page contentType="text/html;
charset=gb232" language="java" import="java.sql.*"  %>
<jsp:useBean id="DBConn" scope="page" class="conn.DBConnMySql"/>
<% //以下几项请自行修改String server="localhost";        
//MYSQL 服务器的地址String dbname="test";      
//MYSQL 数据库的名字String user="root";            
//MYSQL 数据库的登录用户名String pass="chfanwsp";        
//MYSQL 数据库的登录密码String port="3306";          
//SQL Server 服务器的端口号,默认为433Connection
conn=DBConn.getConnToMySql
(server,dbname,user,pass,port);
Statement stmt=conn.cr&amp;#0;ateStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql="sel&amp;#0;ct * from username";
String sql="ins&amp;#0;rt into username (uid,pwd) values
('梦想年华','梦想年华')";stmt.executeUp&amp;#00;ate(sql);
ResultSet rs=stmt.executeQuery(sql);while(rs.next())
{out.print("用户名:");out.print(rs.getString("uid")+" 密码:");
out.println(rs.getString("pwd")+"<br>");}
//rs.close();//stmt.close();//conn.close();DBConn.close();%>
Tags: ,
Jul 30
批处理是一种非交互式运行MySQL程序的方法,如同您在MySQL中使用的命令一样,你仍然将使用这些命令。

为了实现批处理,您重定向一个文件到MySQL程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在MySQL中输入的命令相同的文本。

比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):

  USE Meet_A_Geek;
  Ins�rt INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");
  Ins�rt INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");
  Ins�rt INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");

注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。

上面的USE命令选择数据库,Ins�rt命令插入数据。

下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是mysqld进程(或者说服务,Windows NT下面称为”服务“,unix下面为”进程“)已经在运行。

然后运行下面的命令:

  bin/mysql ?Cp < /home/mark/New_Data.sql  

接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。

命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库,现在您可能会问自己,"究竟为什么我要输入所有的这些SQL语句到文件中,然后通过程序运行它们呢?”

这样看起来好像需要大量的工作。很好,你这样想很可能就对了。但是假如你有从所有这些命令中产生的Log记录呢?现在这样就很棒,嗯,大多数数据库都会自动产生数据库中的事件记录的Log。而大部分Log都包含有用过的原始的SQL命令。因此,如果您不能从您现在的数据库中导出数据到新的mysql数据库中使用,那么您可以使用log和mysql的批处理特性,来快速且方便地导入您地数据。当然,这样就省去了打字的麻烦。  
LOAD DATA INFILE

这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与mysqlimport非常相似,但这个方法可以在mysql命令行中使用。也就是说您可以在所有使用API的程序中使用这个命令。使用这种方法,您就可以在应用程序中导入您想要导入的数据。

使用这个命令之前,mysqld进程(服务)必须已经在运行。

启动MySQL命令行:

  bin/mysql ?Cp

按提示输入密码,成功进入MySQL命令行之后,输入下面的命令:

USE Meet_A_Geek;
LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE oders;

简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令:

LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE oders;

上面的LOCAL参数表示文件是本地的文件,服务器是您所登陆的服务器。

这样就省去了使用ftp来上传文件到服务器,MySQL替你完成了。

您也可以设置插入语句的优先级,如果您要把它标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:

  LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE oders;

您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法:

  LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE oders;

上面的句子看起来有点笨拙,但却把关键字放在了让您的剖析器可以理解的地方。

下面的一对选项描述了文件的记录格式,这些选项也是在mysqlimport工具中可以用的。他们在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:

  TERMINATED BY character
  ENCLOSED BY character
  ESCAPED BY character

这些关键字与它们的参数跟mysqlimport中的用法是一样的。

TERMINATED BY 描述字段的分隔符,默认情况下是tab字符(\t);

ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段 ;

ESCAPED BY 描述的转义字符。默认的是反些杠(backslash:\ )。

下面仍然使用前面的mysqlimport命令的例子,用LOAD DATA INFILE语句把同样的文件导入到数据库中:

  LOAD DATA INFILE "/home/mark/Orders.txt"
REPLACE INTO TABLE oders FIELDS TERMINATED BY '
,' ENCLOSED BY '"';

LOAD DATA INFILE语句中有一个mysqlimport工具中没有特点,与此同进它还可以按指定的列把文件导入到数据库中。

当我们要把数据的一部分内容导入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。

这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的栏目(field)与MySQL中的不再匹配,因此而无法再使用mysqlimport工具。尽管如此,我们仍然可以使用LOAD DATA INFILE,下面的例子显示了如何向指定的栏目(field)中导入数据:

  LOAD DATA INFILE "/home/Order.txt"
INTO TABLE oders(Order_Number, oder_Date, Customer_ID);

我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果遗漏了其中任何一个,MySQL将会做出提醒。
Tags:
Jul 30
当初次在机器上安装完Mysql时,你可以匿名进行访问数据库或者以不带口令的root身份进入数据库.另外如果你是一个管理员,你还要进行一些用户的建立及授权,这又涉及到设置密码的问题.下面我们就讨论一下如何设置密码:

首先我们应该知道Mysql数据库中的口令存储必须用password()函数加密它.因为在user表中是以加密形式存储口令,而不是作为纯文本.如果你没有加密,直接在数据库中执行以下语句:

use mysql
ins�rt into user (host,user,password) values('%','user_name','your password');
flush privileges;

相信结果不会让你满意.因为服务器比较的是加密的值,所以服务器连接一定失败.这里需要说明的是flush privileges;这条命令起到了重新加载授权表.你也可以在shell下直接用mysqladmin -u root reload或者mysqladmin -u root flush-privileges来实现重载授权表.

在Mysql环境下,你可以使用以下语句进行设置密码:

.ins�rt into user(host,user,password) values('%','user_name',password("your password");

2.set password for user_name = password("your password")
以上两种方法都必须进行重载授权表.

3.当然你也可以在创建一个用户时直接设置密码,grant语句将为你自动加密口令.
如 :grant all on *.* to user_name@% identified by "your password";
另外你也可以在shell环境下用mysqladmin程序来设置密码
如: mysqladmin -u root password "your password"
Tags:
分页: 109/196 第一页 上页 104 105 106 107 108 109 110 111 112 113 下页 最后页 [ 显示模式: 摘要 | 列表 ]