mysql主从同步配置

前两天配置了Mysql主从,再记录如下,以备下次查看。

 

主服务器设置

1、登录Master服务器,修改my.cnf,添加如下内容;
[mysqld]
server-id = 53 #//数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
log-bin=mysql-bin #//启用二进制日志;
binlog-do-db=dbname #//需要同步的二进制数据库名;
binlog-ignore-db=mysql /#/不同步的二进制数据库名;这个同步后听说很麻烦,不同步;
log-slave-updates #//把更新的记录写到二进制文件中;
slave-skip-errors=all #//跳过错误,继续执行复制;

2、建立同步用mysql账号,指定允许访问的IP为从服务器IP
mysql> #GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* to rslave@192.168.33.54 identified by '83ea4e19efe34874b50';
mysql> FLUSH PRIVILEGES;

到从服务器上验证登陆:
mysql -urslave -p83ea4e19efe34874b50 -h192.168.33.53

3、写锁定 flush tables with read lock;
4、导出数据mysqldump -uroot -p dbname > webdb.sql

从服务器设置

新版本与老版本的Mysql从服务器设置方式不一样,据说是以5.1.7版为分界线,具体请自己尝试。

老版本的Mysql配置文件[mysqld]后添加:
server-id = 54
log-bin=mysql-bin
master-host = 192.168.33.53
master-user = rslave
master-password = 83ea4e19efe34874b50
master-port = 3306
master-connect-retry=60 #//如果发现主服务器断线,重新连接的时间差
replicate-ignore-db=mysql #//不需要备份的数据库;
replicate-do-db=dbname #//需要备份的数据库
log-slave-update
slave-skip-errors = all #//跳过错误,继续执行复制;

重启Mysql服务后执行:
mysql> start slave;

新版本的Mysql配置文件[mysqld]后添加:
server-id = 61
log-bin=mysql-bin

并执行下面命令:(每次重启都要重新配置)
mysql> stop slave;
mysql> change master to master_host='192.168.33.53',master_user='rslave',master_password='83ea4e19efe34874b50';
mysql> start slave;

 

验证设置是否正确:
mysql> show slave statusG;
主要是看以下两项是否为YES:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

windows下MySQL忘记root密码修改密码的办法

好久没用MySQL了,都忘了Root用户的密码了,Windows环境,mysql5.1的版本,找到了解决办法,记录如下。

步骤如下:
1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql
2.使用 mysqld –skip-grant-tables 命令启动mysql数据库
3.新开一个cmd窗口,依次运行如下命令:

1)mysql -uroot
2)update mysql.user set password=password('root') where user='这里是你想要修改成的密码';
如果返回:
Query OK, 1 row affected (0.02 sec)
Rows matched: 2 Changed: 1 Warnings: 0
这样的结果,说明修改成功
3)flush privileges;

4.打开任务管理器,停止mysql,mysqld进程,使用net start mysql启动mysqld服务,就可以使用root用户 和修改后的密码进入数据库了
 

SQL Server 2000数据库迁移到SQL Server 2005各方法实践

  最近要把一个服务器上的数据库迁移到另一个数据库上。老的数据库是SQL Server 2000的,新服务器上是SQL Server 2005的。

  按常规思路,数据库迁移主要有三种方法:备份-还原、分离-附加及导出-导入。网上介绍的方法也基本上都是这三种方法。

  先试了备份还原,无论是直接在还原时直接命名新建一个数据库还是先新建一个数据库再还原上去,都提示备份文件格式不正确。不知道是什么原因。

  接着就试试分离附加的方法。先将SQL Server 2000服务器上在SQL Server企业处理器里将要转移的数据库分离出来,然后将数据库文件夹里的MDF和LDF文件拷到新服务器上,在SQL Server Management Studio里将数据库文件附加上去,成一个新数据库。附加时可能会报错,说无法访问数据库文件,此时只需将这两个文件的完全控制权限赋予SQL Server 2005的运行用户(一般名为:SQLServer2005MSSQLUser$计算机名$计算机名)。

  至于导出导入的方法,基本上不会出什么问题,只是操作起来相对麻烦一些。

mysql大数据转移解决方案

首先在原来的phpmyadmin中分两步导出mysql数据库

请分两个步骤导出

第一步:导出数据库结构。数据库结构文件一般很小,几乎不可能超过2M,所以可以直接在另外一个phpmyadmin的上面直接恢复;

第二步:导出数据内容。这个文件若是太大,则可以采用cosbeta写的程序进行恢复(程序下载在本页最后,别急,请看完步骤再去下载)。

导出数据库结构

进入phpmyadmin,按照如下步骤导出数据:

1.点击要导出的数据库名

2.点击导出按钮。

3.选择只导出结构

4.下载数据库结构

数据库结构的文件非常小,所以一般几秒钟即可搞定。

导出数据库内容

1.进入phpmyadmin,导出数据:

选择只导出数据

2.下载数据库内容

因为您需要看了我这篇日志,所以,您的数据库文件应该不小,请耐心等待下载。

 

导入数据库结构

同样恢复数据库也分两步:1.恢复数据库结构;2.恢复数据库内容;

由于结构的备份文件相当小,所以恢复结构请直接在phpmyadmin中恢复

导入数据库数据

本文的重点来了,你之所以看这篇日志,是因为您的数据太大,无法直接phpmyadmin,导入,所以我特意你写了一个脚本,直接在服务器上导入即可。

导入方法(请保证已经将数据库结构导入了新的数据库):

  1. 下载这个文件 import,解压缩,放置在根目录中;
  2. 用记事本打开import.php,修改前面4行,您应该知道如何修改,就是把数据库密码和数据库用户名等等给填写正常;
  3. 解压缩刚才已经备份下来的数据库内容文件,重命名为 db.sql,上传到网站根目录;
  4. 打开你的网站 http://您的域名/import.php ,若设置正确的话,数据库将在数秒之内导入成功,即使10M的数据库也不会超时;

附import.php代码:

  1. define('DB_NAME', 'wordpress');
  2. define('DB_USER', 'wordpress');
  3. define('DB_PASSWORD', 'wordpress');
  4. define('DB_HOST', 'localhost');
  5. /*直接copy您wordpress数据库设置部分即可*/
  6. $mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("mysql connect fail, wrong password");
  7. mysql_select_db(DB_NAME)or die("select DB fail");
  8. mysql_query("set names utf8");
  9. $fp = fopen("db.sql","r") or die('can not open file');
  10. while( $s = fgets( $fp,100000 ) ){
  11. $m .= $s;
  12. }
  13. $sql_content = explode(";
    ",$m);
  14. $i = 0;
  15. $max = count($sql_content) ;
  16. while( $i < $max ){
  17. mysql_query( $sql_content [$i] );
  18. if( mysql_error()) echo mysql_error()."<br />";
  19. else{
  20. $n ++;
  21. }
  22. $i ++;
  23. }
  24. echo "<br />mysql queries:".$n;
  25. fclose($fp);

使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法

  在Mysql中创建多用户,为了让每个用户在使用phpmyadmin管理数据库时,只能看到自己同名的数据库,所以在设置用户权限时要特别注意!可以参考以下步骤设置用户权限。
1、新建数据库:
进入phpmyadmin管理界面以后,找到如下文字“创建一个新的数据库”,然后在下面填上要新建的数据库的名称,在后面的下拉列表中选择数据库的编码,如“utf8_general_ci”,点击“创建”按钮,这样就新建了一个数据库。

2、新建此数据库的对应帐户
在phpmyadmin管理界面点击“权限”,打开链接,点击“添加新用户”,在打开的页面中会看到“登入信息”,输入用户名、主机(一般为本地:localhost)、密码后,因为我们现在是要给单个用户配置单个数据库的权限,所以我们在这里不选择“全局权限”,然后点击最下面的“执行”按钮,这样就新建了一个用户名。

3、为新建的用户添加此数据库权限
添加完用户以后,管理界面的上方会提示“您已添加了一个新用户”,我们现在就给新建的用户添加权限,在下面找到“按数据库指定权限”,然后点击“在下列数据库添加权限”后面的下拉列表,选择数据库,选择数据下面的全部,然后选择结构除了最下面三个以外的复选框,其他一律不选,然后点击“执行”按钮,这样就配置好了这个用户完全管理这个数据库的权限了。

  若需要多个主机连接到此数据库,可以在添加完用户后去权限列表处编辑用户,修改主机列表后选中保留原账号保存。这时一去看权限列表,就会多个不同主机的同名用户。

注:
1、因为我们只是要给这个用户管理这个数据库的全部权限,但是没有其他数据库的管理权限,所以在配置权限的时候一定要注意。
2、INFORMATION_SCHEMA是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。假如不想在phpMyAdmin中显示的话只需要设置在config.inc.php(有的是config.default.php)中设置这样一句:$cfg['Servers'][$i]['hide_db'] = ‘information_schema';
  此外,如果在创新用户时,选择“用户数据库”中的“给以 用户名_ 开头的数据库 (username\_%) 授予所有权限”选项,新建的用户就可以自己创建以“username_”开头的数据库。

 

 

Jinitiator控件IE崩溃及Jinitiator界面汉字方框的解决办法

  前几天拿到的一套网络销售系统原来还有个类似ERP的管理后台,折腾了半天才架设起来并找到入口,类似http://IP:7778/forms/frmservlet?config=webutil&form=main,初步了解了下,好像是用Oracle Form builder开发的。在原来就安装好Jinitiator控件的一台服务器上(Windwos Server 2003操作系统)用IE打开这个网址,然后会弹出个类似JVM的界面,但界面上的汉字都是乱码的,就是显示成黑色线的方框。
  网上搜索了下,说是将Jinitiator安装目录C:Program FilesOracleJInitiator 1.3.1.22下的lib文件夹里的font.properties.zh.5.1复制一份,重命名为font.properties.zh.5.2即可解决,试了下,果然成功了。
  为了方便查看系统,同事就在他的办公电脑(Windows 7)上也浏览器那个网址,并按提示安装了Jinitiator控件,但是安装完成后用IE浏览器这个网址直接就崩溃了。我也在自己的笔记本上(Windows Server 2008)安装此控件,用IE打开也直接崩溃,用Maxthon打开,提示:
Maxthon 阻止了一个错误.
Fault address: 6D4AC228 03:00014228 C:PROGRA~1OracleJINITI~1.22inhotspotjvm.dll
然后就崩溃了。
同事说难道Win7之类的系统与这个控件不兼容?找了台装有Windows XP的电脑试了下,依旧崩溃。
  网上查了下资料,看到有人说Jinitiator和JVM其实是差不多的东西,我就想尝试下安装个JDK看看能不能解决。先是把Jinitiator卸载了,然后安装JDK,试了下还是失败,再把Jinitiator装上去,依旧不成功。
  回顾了下整个过程,我又注意到Maxthon下的错误提示,是与jvm.dll有关的,那把JDK下的jvm.dll复制过来替换了,是否能行呢?搜索下JDK安装目录,找到三个jvm.dll文件,分别在“Javajre6inclient”、“Javajdk1.6.0_10jreinclient”和“Javajdk1.6.0_10jreinserver”目录下,前两个文件大小是一样的,我猜是同样的文件,还有一个文件稍大,用哪个好呢?既然是在运行客户端,那就用client目录下的吧,替换后,再次打开那个网址,再也不崩溃了。
  一波刚平一波又起,IE是不崩溃了,打开的界面同样是乱码的,并且用刚刚那个办法无法解决。再次上网搜索,很快找到解决办法:
在Jinitiator安装目录的lib文件夹中找到font.properties.zh,把里面的
filename.u5b8bu4f53=SIMSUN.TTF
改为
filename.u5b8bu4f53=SIMSUN.TTC
即可
  折腾了半天,解决了两个问题,现将解决办法记录在此,供遇到相同问题的朋友参考。

Oracle数据库出错ORA-01033的解决办法之一

  这几天拿到一套网络销售系统(连电脑一起搬过来),要架设起来看看。开机后发现是Windows Server 2003的操作系统,IIS下的ASP站点,用的是Oracle数据库。打开站点发现报错:ORA-01033:oracle initializationg or shutdown in progress ,是数据库连接问题。通过PL/SQL Developer连接Oracle时也报ORA-01033:oracle initializationg or shutdown in progress 错误提示。经过一番折腾解决了问题。解决思路为:用命令行模式启动数据库服务,看看初始化与装载数据库时具体提示哪个地方出错。过程如下:

1、进入CMD,执行set orACLE_SID=db(要确保连接到正确的SID)
2、执行sqlplus “/as sysdba”
  SQL>shutdown immediate  (先停止服务)
  SQL>startup          (启动服务)
数据库装载完毕,但是报错:
orA-16038:日志 3 序列号 290 无法归档
orA-19504:无法创建文件””
orA-00312:联机日志线程1:'F:ORACLEORADATADBREDO03.LOG'

3、联想到之前系统提示F盘空间不足,虽然我之前已经清理了一些,但是我看了下才几十M的可用空间了,难道是这个原因?再次清理了下F盘,然后再次停止服务后启动服务,此次正常。
4、进入PL/SQL Developer检查,没有再提示错误。
  至此,问题解决,打开站点访问也没有报错了。

PHP利用SMTP发送邮件(Mail)的类与函数

  很多情况下,服务器都没有建邮件服务器,因为PHP自带的Mail函数基本上起不了什么作用。废话不多说,分享一个用SMTP可以发信的类和函数。
SMTP类代码:
[code]class smtp
{
/* Public Variables */
var $smtp_port;
var $time_out;
var $host_name;
var $log_file;
var $relay_host;
var $debug;
var $auth;
var $user;
var $pass;

/* Private Variables */
var $sock;

/* Constractor */
function smtp($relay_host = “”, $smtp_port = 25,$auth = false,$user,$pass)
{
$this->debug = FALSE;
$this->smtp_port = $smtp_port;
$this->relay_host = $relay_host;
$this->time_out = 30; //is used in fsockopen()
#
$this->auth = $auth;//auth
$this->user = $user;
$this->pass = $pass;
#
$this->host_name = “localhost”; //is used in HELO command
$this->log_file = “”;

$this->sock = FALSE;
}

/* Main Function */
function sendmail($to, $from, $subject = “”, $body = “”, $mailtype, $cc = “”, $bcc = “”, $additional_headers = “”)
{
$mail_from = $this->get_address($this->strip_comment($from));
$body = ereg_replace(“(^|(
))(\.)”, “\1.\3”, $body);
$header .= “MIME-Version:1.0
“;
if($mailtype==”HTML”){
$header .= “Content-Type:text/html
“;
}
$header .= “To: “.$to.”
“;
if ($cc != “”) {
$header .= “Cc: “.$cc.”
“;
}
$header .= “From: $from<“.$from.”>;
“;
$header .= “Subject: “.$subject.”
“;
$header .= $additional_headers;
$header .= “Date: “.date(“r”).”
“;
$header .= “X-Mailer:By Redhat (PHP/”.phpversion().”)
“;
list($msec, $sec) = explode(” “, microtime());
$header .= “Message-ID: <“.date(“YmdHis”, $sec).”.”.($msec*1000000).”.”.$mail_from.”>;
“;
$TO = explode(“,”, $this->strip_comment($to));

if ($cc != “”) {
$TO = array_merge($TO, explode(“,”, $this->strip_comment($cc)));
}

if ($bcc != “”) {
$TO = array_merge($TO, explode(“,”, $this->strip_comment($bcc)));
}

$sent = TRUE;
foreach ($TO as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);
if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write(“Error: Cannot send email to “.$rcpt_to.”
“);
$sent = FALSE;
continue;
}
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write(“E-mail has been sent to <“.$rcpt_to.”>;
“);
} else {
$this->log_write(“Error: Cannot send email to <“.$rcpt_to.”>;
“);
$sent = FALSE;
}
fclose($this->sock);
$this->log_write(“Disconnected from remote host
“);
}
return $sent;
}

/* Private Functions */

function smtp_send($helo, $from, $to, $header, $body = “”)
{
if (!$this->smtp_putcmd(“HELO”, $helo)) {
return $this->smtp_error(“sending HELO command”);
}
#auth
if($this->auth){
if (!$this->smtp_putcmd(“AUTH LOGIN”, base64_encode($this->user))) {
return $this->smtp_error(“sending HELO command”);
}

if (!$this->smtp_putcmd(“”, base64_encode($this->pass))) {
return $this->smtp_error(“sending HELO command”);
}
}
#
if (!$this->smtp_putcmd(“MAIL”, “FROM:<“.$from.”>;”)) {
return $this->smtp_error(“sending MAIL FROM command”);
}

if (!$this->smtp_putcmd(“RCPT”, “TO:<“.$to.”>;”)) {
return $this->smtp_error(“sending RCPT TO command”);
}

if (!$this->smtp_putcmd(“DATA”)) {
return $this->smtp_error(“sending DATA command”);
}

if (!$this->smtp_message($header, $body)) {
return $this->smtp_error(“sending message”);
}

if (!$this->smtp_eom()) {
return $this->smtp_error(“sending <CR>;<LF>;.<CR>;<LF>; [EOM]”);
}

if (!$this->smtp_putcmd(“QUIT”)) {
return $this->smtp_error(“sending QUIT command”);
}

return TRUE;
}

function smtp_sockopen($address)
{
if ($this->relay_host == “”) {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}

function smtp_sockopen_relay()
{
$this->log_write(“Trying to “.$this->relay_host.”:”.$this->smtp_port.”
“);
$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write(“Error: Cannot connenct to relay host “.$this->relay_host.”
“);
$this->log_write(“Error: “.$errstr.” (“.$errno.”)
“);
return FALSE;
}
$this->log_write(“Connected to relay host “.$this->relay_host.”
“);
return TRUE;
}

function smtp_sockopen_mx($address)
{
$domain = ereg_replace(“^.+@([^@]+)$”, “\1”, $address);
if (!@getmxrr($domain, $MXHOSTS)) {
$this->log_write(“Error: Cannot resolve MX “”.$domain.””
“);
return FALSE;
}
foreach ($MXHOSTS as $host) {
$this->log_write(“Trying to “.$host.”:”.$this->smtp_port.”
“);
$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write(“Warning: Cannot connect to mx host “.$host.”
“);
$this->log_write(“Error: “.$errstr.” (“.$errno.”)
“);
continue;
}
$this->log_write(“Connected to mx host “.$host.”
“);
return TRUE;
}
$this->log_write(“Error: Cannot connect to any mx hosts (“.implode(“, “, $MXHOSTS).”)
“);
return FALSE;
}

function smtp_message($header, $body)
{
fputs($this->sock, $header.”
“.$body);
$this->smtp_debug(“>; “.str_replace(”
“, ”
“.”>; “, $header.”
>; “.$body.”
>; “));

return TRUE;
}

function smtp_eom()
{
fputs($this->sock, ”
.
“);
$this->smtp_debug(“. [EOM]
“);

return $this->smtp_ok();
}

function smtp_ok()
{
$response = str_replace(”
“, “”, fgets($this->sock, 512));
$this->smtp_debug($response.”
“);

if (!ereg(“^[23]”, $response)) {
fputs($this->sock, “QUIT
“);
fgets($this->sock, 512);
$this->log_write(“Error: Remote host returned “”.$response.””
“);
return FALSE;
}
return TRUE;
}

function smtp_putcmd($cmd, $arg = “”)
{
if ($arg != “”) {
if($cmd==””) $cmd = $arg;
else $cmd = $cmd.” “.$arg;
}

fputs($this->sock, $cmd.”
“);
$this->smtp_debug(“>; “.$cmd.”
“);

return $this->smtp_ok();
}

function smtp_error($string)
{
$this->log_write(“Error: Error occurred while “.$string.”.
“);
return FALSE;
}

function log_write($message)
{
$this->smtp_debug($message);

if ($this->log_file == “”) {
return TRUE;
}

$message = date(“M d H:i:s “).get_current_user().”[“.getmypid().”]: “.$message;
if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, “a”))) {
$this->smtp_debug(“Warning: Cannot open log file “”.$this->log_file.””
“);
return FALSE;
}
flock($fp, LOCK_EX);
fputs($fp, $message);
fclose($fp);

return TRUE;
}

function strip_comment($address)
{
$comment = “\([^()]*\)”;
while (ereg($comment, $address)) {
$address = ereg_replace($comment, “”, $address);
}

return $address;
}

function get_address($address)
{
$address = ereg_replace(“([
])+”, “”, $address);
$address = ereg_replace(“^.*<(.+)>;.*$”, “\1”, $address);

return $address;
}

function smtp_debug($message)
{
if ($this->debug) {
echo $message;
}
}
}[/code]
再写个发邮件函数,方便调用,代码:
[code]function sendmail($smtpserver,$smtpuser,$smtppass,$smtpemailto,$smtpusermail, $mailsubject, $mailbody){
$smtp = new smtp($smtpserver,25,true,$smtpuser,$smtppass);
//$smtp->debug = TRUE;
$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, “HTML”);
}[/code]
调用函数发送邮件:
$body=”邮件内容。。。。。”;
sendmail(“smtp.exmail.qq.com”,”邮箱登录名”,”邮箱密码”,”收件邮箱”,”发件邮箱”,”主题”,$body);

各种SQLite数据库管理工具使用经历

  今天在研究一个PHP企业站系统,用的是SQLite数据库。于是,去找了几款SQLite数据库管理工具。
  第一个出场的是Navicat for SQLite。我用的是9.0.15版。顺利连接上数据库文件,并打开数据库。只是,当我查看数据库里的内容里,遇到了点小问题,字段内容里的中文都成乱码了。暂时未找到解决办法。
  接着又找来了SQLite Developer。版本3.5.8。结果,直接报错,打不开我那个2.1版的数据库文件。
  夜深了,有空再继续测试,继续写。