mysq 两个不同数据数据库之间相同表数据同步

zp87530 2009-09-15 10:59:53
就是 两个数据库 A和B

A和B的数据库结构是完全一样的 在同一台服务器上

A和B中都有一个表P 现在想要把数据库A更新时同时更新B的表P

这样就需要在A的表P上建立个触发器 。

由于刚刚学学触发器,所以不是很熟,请大家帮帮忙。

...全文
529 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zp87530 2009-09-15
  • 打赏
  • 举报
回复
create trigger calendar after insert on ECONOMIC_CALENDAR

for each now
insert into [ECONOMIC_CALENDAR].dbo.[hym]
(
[CALENDAR_DATE] ,
[CALENDAR_TIME_GMT]
) select
[CALENDAR_DATE] ,
[CALENDAR_TIME_GMT]

from [ECONOMIC_CALENDAR].dbo.[piptrade] where CALENDAR_ID=(select max(CALENDAR_ID) from [ECONOMIC_CALENDAR].dbo.[piptrade])

这样写行不?
liuyancun1996 2009-09-15
  • 打赏
  • 举报
回复
CREATE TRIGGER 触发器名称
ON [dbo].[A数据库表名]
FOR INSERT AS
BEGIN
SET NOCOUNT ON;
set insert B.dbo.B数据库表名(B数据库表名列1,B数据库表名列n)
select A数据库表名列1,A数据库表名列n from inserted
END
ChinaJiaBing 2009-09-15
  • 打赏
  • 举报
回复
机器A:ip地址 192.168.1.210 (maste1)

机器B:ip地址 192.168.1.211 (master2)

机器A同时充当Slave角色,为便于区分,名称设为 Slave2

机器B同时充当Slave角色,为便于区分,名称设为 Slave1

假设两台机器都已经安装好mysql,安装路径假设/usr/local/mysql/下,并假设

mysql配置文件my.cnf存放在/etc/下

二。修改机器A中mysql配置文件/etc/my.cnf

在[mysqld]配置段添加如下字段


引用
binlog-do-db= wywdb # 指明欲同步数据库
binlog-ignore-db=mysql # 指明不需要同步数据库
binlog-ignore-db=test # 指明不需要同步数据库

并假设次server id 为1,即
server-id=1

在机器A,即master1上为机器B,即slave1添加一同步帐号

引用
grant replication slave on *.* to ‘replication’@192.168.1.211 identified by ’slave’;


然后重启A机器mysql

三。修改B机器中mysql配置文件

同样在[mysqld]字段下添加如下内容

引用
server-id=2
master-host = 192.168.1.210
master-user = replication
master-password = slave
master-port = 3306


然后重启B机器mysql


四。在B中进入mysql

引用
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.210
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: webserver-relay-bin.000004
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

ERROR:
No query specified


将显示以上同步信息,其中Slave_IO_Running和Slave_SQL_Running对应字段内容都为yes,
并且Slave_IO_State显示“Waiting for master to send event”,则表示mysql的Master和Slave
模式配置成功,否则表示不成功,可查看相应日志,查看什么地方出现了问题。

此时还可可进去A机器中查看master1的mysql同步信息,并可与B机器mysql对比。
在A机器中进入mysql:


引用
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 98 | wywdb | mysql,test |
+——————+———-+————–+——————+
1 row in set (0.00 sec)


五。在机器B中为其增加一同步复制帐号
mysql> grant replication slave on *.* to ‘replication’@192.168.1.210 identified by ’slave2′;

并修改A中mysql的配置文件
在[mysqld]增加如下内容
master-host = 192.168.1.211
master-user = replication
master-password = slave2
master-port = 3306

六。依次重启A和B中mysql
进A中mysql
mysql> start slave;

然后可以查看同步情况
进入A中:


引用
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.211
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 98
Relay_Log_File: centos-relay-bin.000005
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

ERROR:
No query specified

mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 | 98 | wywdb | mysql,test |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
在B中:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.210
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 98
Relay_Log_File: webserver-relay-bin.000007
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

ERROR:
No query specified

引用
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 | 98 | wywdb | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)

看到如上信息证明mysql的master和master模式同步配置成功。
七。简单同步验证测试
在A中

引用

mysql> use wywdb
Database changed

mysql> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test values(1,’wanzhihua’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+——+———–+
| id | name |
+——+———–+
| 1 | wanzhihua |
+——+———–+
1 row in set (0.01 sec)


然后进入B中

引用
mysql> use wywdb
Database changed

mysql> select * from test;
+——+———–+
| id | name |
+——+———–+
| 1 | wanzhihua |
+——+———–+
1 row in set (0.00 sec)


证明A--->B同步成功

接着

mysql> insert into test values (2, ’shenyanfei’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+——+————+
| id | name |
+——+————+
| 1 | wanzhihua |
| 2 | shenyanfei |
+——+————+
2 rows in set (0.01 sec)

然后进去A中


引用
mysql> select * from test;
+——+————+
| id | name |
+——+————+
| 1 | wanzhihua |
| 2 | shenyanfei |
+——+————+
2 rows in set (0.00 sec)
证明AB互为同步成功。

soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
最好写一个存储过程

然后用作业调用存储过程实现!
guguda2008 2009-09-15
  • 打赏
  • 举报
回复
MYSQL,帮顶
soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
>>>>>>soft_wsx>>>>>>
--数据备份与还原>>同步备用服务器
--1、完全备份主数据库
--2、使用带SANDBY子句的RESTORE DATABASE语句从主数据库的完全备份中还原生成备用数据库
--3、创建作业,使用BACKUP LOG定时对主数据库时行日志备份
--4、创建作业,使用带STANDBY子句的RESTORE LOG语句定时从主数据库的日志备份中恢复数据到备用数据库
--5、主数据库不可用时,使用带RECOVERY子句的RESTORE LOG语句使备用数据库升级为主数据库
----具体代码及说明如下
---->>首先、创建一个淙用的数据库(主数据库)
create database db_test_primary
on
(
name=db_test_primary_data,
filename='d:\db_test_primary_data.mdf')
log on
(
name='db_test_primary_log',
filename='d:\db_test_primary_log.ldf'
)
go

--在主数据库上创建表
create TABLE db_test_primary.dbo.db_test_primary1(id int)
insert db_test_primary.dbo.db_test_primary1 select top 1000 ID from dbo.sysobjects
go
--对主数据库进行备份
backup database db_test_primary
to disk='d:\db_test_primary_data.bak'
with format
go

--通过主数据库备份文件创建备用数据库(演示主数据库与这个备用数据库之间的同步)
restore database db_test_second
from disk='d:\db_test_primary_data.bak'
with replace,
standby='d:\db_test_primary_bak.ldf',
move 'db_test_primary_data' to 'd:\db_test_second_data.mdf',
move 'db_test_primary_log' to 'd:\db_test_second_log.ldf'

--启动SQL AGENT服务(需要通过作业定时将主数据库同步到备用数据库)
exec master.dbo.xp_cmdshell 'net start sqlserveragent',no_output
go

--创建主服务数据库与备用服务器数据库之间同步的作业
declare @jobid uniqueidentifier
exec msdb.dbo.sp_add_job
@job_id=@jobid output,
@job_name=N'数据同步'

--创建同步处理步骤
exec msdb.dbo.sp_add_jobstep
@job_id=@jobid,
@step_name=N'数据同步',
@subsystem='TSQL',
@command=N'
--主数据库中进行日志备份
backup log db_test_primary
to disk=''d:\test_log_primary.bak''
with format

--备用数据中还原主数据库的日志备份(应用主数据库中的最新变化)
--注:实际应该对主数据库备份与备用数据库的还原作业应该分别在主服务器和备用服务器上建立,
--并且备份文件应该放在主服务器和备用服务器都能访问的共享目录中
restore log db_test_second
from disk=''d:\test_log_primary.bak''
with standby=''d:\test_log.ldf''',
@retry_attempts=5,
@retry_interval=5
--创建调度
exec msdb.dbo.sp_add_jobschedule
@job_id=@jobid,
@name='时间安排',
@freq_TYPE=4,
@freq_interval=1,
@freq_subday_type=0x4,
@freq_subday_interval=1

--添加目录服务器
exec msdb.dbo.sp_add_jobserver
@job_ID=@jobid,
@server_name=N'(local)'
go
--通过上述处理,主数据库与备用数据库之间的同步关系已经设置完成
--下面开始测试是否能实现同步
create table db_test_primary.dbo.db_test_primary3(id int)
go
insert db_test_primary.dbo.db_test_primary3 select top 5000 id from dbo.sysobjects
waitfor delay '00:01:30'
go

--查询一下备用数据库,看看同步是否成功

select * from db_test_second.dbo.db_test_primary3


drop table db_test_primary.dbo.db_test_primary3


--最后删除测试环境
drop database msdb.dbo.sp_delete_job
@job_name=N'数据同步'
这个方法!另外可以用发布!
zp87530 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zp87530 的回复:]
CREATE TRIGGER piptrade.calendartest

ON [ECONOMIC_CALENDAR]

FOR INSERT AS

set insert hym.[ECONOMIC_CALENDAR](CALENDAR_DATE,CALENDAR_TIME_GMT)

select CALENDAR_DATE,CALENDAR_TIME_GMT from inserted

这样写不报错。但是往piptrade里面插入 。。hym数据库表里面没反应啊?
帮忙看看。
[/Quote]



CREATE TRIGGER piptrade.calendartest after insert
ON [ECONOMIC_CALENDAR]

FOR INSERT AS

set insert hym.[ECONOMIC_CALENDAR](CALENDAR_DATE,CALENDAR_TIME_GMT)

select CALENDAR_DATE,CALENDAR_TIME_GMT from inserted

加入after insert还是不行。。。
zp87530 2009-09-15
  • 打赏
  • 举报
回复

CREATE TRIGGER piptrade.calendartest

ON [ECONOMIC_CALENDAR]

FOR INSERT AS

set insert hym.[ECONOMIC_CALENDAR](CALENDAR_DATE,CALENDAR_TIME_GMT)

select CALENDAR_DATE,CALENDAR_TIME_GMT from inserted

这样写不报错。但是往piptrade里面插入 。。hym数据库表里面没反应啊?
帮忙看看。
soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
原来是MYSQL帮顶了!

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧