PostgreSQL主从复制

教程大全 2025-07-17 01:07:54 浏览
sourcedb=# SELECT slot_name,plugin,slot_type,database,active,restart_lsnFROM pg_Replication_slots where slot_name='sub1'; slot_name |plugin| slot_type |>在逻辑从库上可以查询到如下信息:

desdb=# SELECT * FROM pg_subscription; subdbid | subname | subowner | subenabled |subconninfo| subslotname | subsynccommit | subpublications---------+---------+----------+------------+---------------------------------------------------------------------------------------+-------------+---------------+-----------------24995 | sub1|10 | t| host=192.168.56.32 port=5432 user=logical_repl dbname=sourcedb password=logical_repl | sub1| off| {pub1}(1 row)

(8)给复制账号授权

因为步骤2.3中只创建了复制账号并未对需要复制的表进行授权,因此,此时逻辑从库的日志中有如下错误

2019-10-10 15:57:21.847 CST [27443] ERROR: could not start initial contents copy for table "public.logical_tb1": ERROR: permission denied for table logical_tb12019-10-10 15:57:21.848 CST [24722] LOG: background worker "logical replication worker" (PID 27443) exited with exit code 1

因此 ,现在需要对复制用户授权。

sourcedb=# GRANT USAGE ON SCHEMA public TO logical_repl;GRANT sourcedb=# GRANT SELECT ON logical_tb1 TO logical_repl;GRANT

授权后,显示正常。

2019-10-10 16:00:25.959 CST [28204] LOG: logical replication table synchronization worker for subscription "sub1", table "logical_tb1" has started2019-10-10 16:00:25.967 CST [28204] LOG: logical replication table synchronization worker for subscription "sub1", table "logical_tb1" has finished

(9)测试数据同步

在逻辑主库插入数据。

/** 在主库插入数据 */ sourcedb=# insert into logical_tb1(id,name) values(1,'a'),(2,'bca');INSERT 0 2

在逻辑从库查看结果。

/** 查看数据是否同步完成 */ desdb=# select * from logical_tb1; id | name----+------1 | a2 | bca(2 rows)
Postgre<a href=Sql主从复制" src="https://www.kuidc.com/zdmsl_image/article/20250717010755_47600.jpg" loading="lazy">

由此可见数据已同步完成。

(10)添加复制所需的表

在逻辑主库和逻辑从库均添加一张新表,并添加到发布列表中。

/** 主库上创建表结构 */ sourcedb=# create table logical_tb2(id int primary key ,addr varchar(100));CREATE TABLE sourcedb=#/** 从库上创建表结构 */desdb=# create table logical_tb2(id int primary key ,addr varchar(100));CREATE TABLE /** 在主库上给逻辑复制账号授权 */ sourcedb=# GRANT SELECT ON logical_tb2 TO logical_repl;GRANT/** 添加新表至发布列表 */ sourcedb=# ALTER PUBLICATION pub1 ADD TABLE logical_tb2;ALTER PUBLICATION/** 在主库查看发布列表中的表名 */sourcedb=# SELECT * FROM pg_publication_tables; pubname | schemaname |tablename---------+------------+------------- pub1| public| logical_tb1 pub1| public| logical_tb2(2 rows)

此时已加入一张表进入发布列表中。

此时在主库写入数据,查看从库情况如下:

/** 主库插入一条记录 */ sourcedb=# insert into logical_tb2(id,addr) values(1,'beijing');INSERT 0 1 /** 此时在逻辑从库查看,结果却没有数据 */desdb=# select* from logical_tb2; id | addr----+------(0 rows)

因为还需要在从库刷新一下订阅。

/** 此时在从库刷新订阅 */ desdb=# ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;/** 刷新完成后再查数据已经有数据了 */ ALTER SUBSCRIPTIONdesdb=# select* from logical_tb2; id |addr----+---------1 | beijing(1 row)

至此,PostgreSQL的逻辑复制也部署完毕。

3、物理复制与逻辑复制特点和应用场景

PostgreSQL的逻辑复制与物理复制的差异比较突出,在使用中可以根据其特点选择使用哪种复制方式。


Oracle中数据迁移的工具

SQL*Plus Copy命令问题描述怎样在SQL*Plus中实现不同的表之间的数据复制,不论是本地的还是远程的?问题分析在SQL*Plus中的copy命令,可以完成远程数据库、本地数据库或Oracle数据库与非Oracle数据库之间的数据复制。 其性能与导入/导出相同。 copy的基本命令格式:copy {from source_database |to destination_database}{append|create|insert|replace}destination_table[(column,column,column,...)]using其中数据库连接使用如下格式:username/password\]@Connect_identifier在数据复制时,复制支持的数据类型为:char、date、long、number、varchar2。 所示。 SQL*Plus Copy命令可在不同数据库之间,以及同一个数据库内的不同模式的表之间复制数据。 ?•从远程数据库复制数据到本地数据库。 ?•从本地数据库(默认)复制数据到远程数据库。 ?•从一个远程数据库复制数据到另一个远程数据库。 通常,copy命令用于Oracle数据库与非Oracle数据库之间复制数据。 如果在Oracle数据库之间复制数据,应该使用create table as 和insert的SQL命令。 •对目标表的控制方式有4种类型:replace、create、insert和append。 ?•replace子句指定了被创建的表名。 如果目标表已存在,则删除并用包含复制数据的表替代。 若不存在,则创建目标表。 ?•使用create子句可避免覆盖已存在的表。 若目标表已存在,则copy报告一个错误;若不存在,则创建目标表。 ?•insert插入数据到已存在的表。 将查询到的行插入到目标表,如果目标表不存在,copy返回错误。 当使用insert时,using子句必须为目标表的每个列选择对应的列。 ?•append是将查询到的行插入到目标表。 如果不存在,则创建目标表并插入。 问题解答首先应注意的是:1)copy是SQL*Plus命令,不是SQL命令,在语句最后不必加分号;2)由于多数copy命令比较长,所以,在分行时每行末尾必须有续行符(-),最后一行不加。 具体步骤如下。 步骤1:使用using子句指定一个查询,将其查询结果数据复制到本地数据库的当前模式下employee表中。 例如:copy from hr/hrd@rensh-replace employee-using select last_name,salary-from emp_details_view-where department_id=30步骤2:使用create从一个远程数据库复制数据到本地数据库。 copy from hr/@bostondb-create empcopy-using select*from hr步骤3:为其他用户复制数据。 copy from hr/hr@dbora-create job-using select*from 以用户hr连接到数据库dbora,将renbs模式的jobs表复制到当前本地数据库。 步骤4:在同一个数据库中可将一个模式的表复制到另一个模式中。 同样必须指定用户口令和数据库服务名。 copy from hr/password@mydatabase-insert employee_copy2-using select * from employee_copy步骤5:在同一个远程数据库中复制表,必须是关键字from和to中包含相同用户名和数据库服务名。 copy from hr/password@daliandb-to hr/password@daliandb-insert employee_copy2-using select * from employee_copy

如何操作硬盘对刻?

一、分区备份使用Ghost进行系统备份,有整个硬盘(Disk)和分区硬盘(Partition)两种方式。 在菜单中点击 Local(本地)项,在右面弹出的菜单中有3个子项,其中 Disk表示备份整个硬盘(即克隆)、Partition 表示备份硬盘的单个分区、Check 表示检查硬盘或备份的文件,查看是否可能因分区、硬盘被破坏等造成备份或还原失败。 分区备份作为个人用户来保存系统数据,特别是在恢复和复制系统分区时具有实用价值。 选 Local→Partition→To Image 菜单,弹出硬盘选择窗口,开始分区备份操作。 点击该窗口中白色的硬盘信息条,选择硬盘,进入窗口,选择要操作的分区(若没有鼠标,可用键盘进行操作:TAB键进行切换,回车键进行确认,方向键进行选择)。 在弹出的窗口中选择备份储存的目录路径并输入备份文件名称,注意备份文件的名称带有 GHO 的后缀名。 接下来,程序会询问是否压缩备份数据,并给出3个选择:No 表示不压缩,Fast表示压缩比例小而执行备份速度较快,High 就是压缩比例高但执行备份速度相当慢。 最后选择 Yes 按钮即开始进行分区硬盘的备份。 Ghost 备份的速度相当快,不用久等就可以完成,备份的文件以 GHO 后缀名储存在设定的目录中。 二、硬盘克隆与备份硬盘的克隆就是对整个硬盘的备份和还原。 选择菜单Local→Disk→To Disk,在弹出的窗口中选择源硬盘(第一个硬盘),然后选择要复制到的目标硬盘(第二个硬盘)。 注意,可以设置目标硬盘各个分区的大小,Ghost 可以自动对目标硬盘按设定的分区数值进行分区和格式化。 选择 Yes 开始执行。 Ghost 能将目标硬盘复制得与源硬盘几乎完全一样,并实现分区、格式化、复制系统和文件一步完成。 只是要注意目标硬盘不能太小,必须能将源硬盘的数据内容装下。 Ghost 还提供了一项硬盘备份功能,就是将整个硬盘的数据备份成一个文件保存在硬盘上(菜单 Local→Disk→To Image),然后就可以随时还原到其他硬盘或源硬盘上,这对安装多个系统很方便。 使用方法与分区备份相似。 三、备份还原如果硬盘中备份的分区数据受到损坏,用一般数据修复方法不能修复,以及系统被破坏后不能启动,都可以用备份的数据进行完全的复原而无须重新安装程序或系统。 当然,也可以将备份还原到另一个硬盘上。 要恢复备份的分区,就在界面中选择菜单Local→Partition→From Image,在弹出窗口中选择还原的备份文件,再选择还原的硬盘和分区,点击 Yes 按钮即可。 《引用》

如何添加新数据库到mysql主从复制列表

首先,我们大概罗列一下主从复制的基本步骤,(MySQL主从首先需要在各自服务器配置好)。 1. 复制数据库。 mysqldump --master-data --single-transaction -R --databases [db_name] | gzip -9 - | pv > 注意:innodb用 –single-transaction, myisam需要用 –lock-all-tables。 2. 复制,导入数据。 pv < | zcat | mysql3. 启动slave数据库。 slave start注意:切换到主的语句已经在导出的sql语句里面了,注意查看。 change master to master_log_file=’(binlog name in relay_master_log_file)’, master_log_pos=(exec_master_log_pos number)。 那么,在现有的主从复制结构中,如何增加一个新的数据库进去?比如我们要增加一个数据库在master服务器上,比如,名为newdb的数据库。 具体操作如下:1. 从服务上,停掉slave数据库。 stop slave;2. 主服务器上,导出新数据库。 mysqldump --master-data --single-transaction -R --databases newdb > 3. 主服务器上,修改文件,添加新库到binlog-do-db参数,重启mysql。 4. 在导出的里面查找当前的日志文件以及位置(change master to …)然后让slave服务器执行到这个位置。 start slave until MASTER_LOG_FILE=mysql-bin., MASTER_LOG_POS=;其中MASTER_LOG_FILE以及MASTER_LOG_POS在导出的数据库顶部位置查找。 4. 导入新库到从服务器上。 mysql < 5. start slave其中比较重要的是在主服务器上导出新库时的日志位置(position A),这个点很重要,以这个点做为分界线,导入新库。 这种方法也同样适用于某个数据库或者某个数据表不同步的情况,比如主从数据库有一个表由于某些原因数据不一致,那么上面的方法只需要去掉重启数据库一步,其他的操作基本

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐