电玩城打鱼捕鱼-专业24小时上下分

跨Oracle数据库实现表级别的实时同步,MySQL查询所有数据库表出错

六月 6th, 2019  |  电玩城上下分数据库

MySQL查询所有数据库表出错

1、错误描述

1 queries executed, 0 success, 1 errors, 0 warnings

查询:show tables

错误代码: 1046
No database selected

执行耗时   : 0 sec
传送时间   : 0 sec
总耗时      : 0 sec

2、错误原因

show tables;

3、解决办法

use test;

show tables;

1、错误描述 1 queries
executed, 0 success, 1 errors, 0 warnings查询:show tables错误代码:
1046No database selected执行耗时 : 0…

Unsplash

[Python]Python/PHP如何查询sql server中NTEXT类型数据

Version

Date

Creator

Description

1.0.0.1

2006-11-23

郑昀

草稿

 

继续阅读之前,我们假设您熟悉以下知识:

n        
Python / PHP

n        
SQL Server 2000 SP4以上版本的Microsoft sql
server

n        
pymssql

n        
NTEXT类型

本文讨论了在Python中,如果利用pymssql来连接Microsft Sql
server 2000 SP4以上版本数据库查询NTEXT类型数据,如何成功返回数据。

在PHP中类似问题也可以这么解决。

 

pymssql – Simple
MSSQL Python extension module,当前我们使用的版本是

pymssql-0.7.4.win32-py2.4.exe。

 

您可以遵循后文描述的执行步骤,在此之前,我们先描述一个常见的错误现象。

一. 前言

这个问题是上一篇文章《Oracle跨数据库实现定时同步指定表中的数据》中所提问题的进一步延伸。考虑到对数据的实时性要求比较高,设置成定时同步,有点不妥,需要改善升级更改为实时同步。

下面介绍到的方式,严格意义上说,并没有实现实时同步。是通过Oracle数据库创建同义词+DBlink的方式,来建立远程映射。在查看数据时,直接去远程查询源库中的表。

而我一直关注的是如何进行同步数据,却没有考虑到可以建立映射。另外,还有一点就是需要交代,就是同步到目标数据库中的表,不进行增删改操作,只进行查询的操作,这也是可以使用同义词方式解决问题的关键。

这种解决思路的出现,多亏了在CSDN问答时,热心网友的回答,下面就是问题详情描述。

[常见错误现象1]

关键词:      Unicode data in a Unicode-only collation or ntext
data

cannot
be sent to clients using DB-Library

表象:          如果你的**sql server 2000
sp4以上版本的数据库中有一个字段是NTEXT类型,那么当你使用pymssql来做查询的时候,您可能得到如下错误:**

 

错误日志

MS SQL message: ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier. (severity 16)

_mssql.error: SQL Server message 4004, severity 16, state 1, line 1:

Unicode data in a Unicode-only collation or ntext data cannot be sent

to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier.

 

 

解释:         

这是因为我们的pymssql使用早期的ODBC函数集来获取数据。而微软后来引入了ntext和nvarchar类型,而这是Microsoft C-library所不支持的。所以,连pymssql的说明档里也这么建议:

注释

It’s the SQL Server complaining that it doesn’t support pure Unicode

via TDS or older versions of ODBC. There’s no fix for this error.

A workaround is to change the column type to NVARCHAR (it doesn’t

exhibit this behaviour), or plain TEXT.

是不是真的要改变你的字段类型了呢?

二. 问题描述

有两个Oracle数据库,分别布置在不同的服务器上,系统均为windows2003;
这里暂且说成是一个主数据库和从数据库:
(1) 主数据库:oracle_A
(2) 从数据库:oracle_B
在oracle_A中有一个表table_A与oracle_B中的表table_B结构相同
我是处在oracle_B,oracle_A数据库分配给我有一个访问oracle_A表table_A的用户,该用户只拥有查询的权限
另外,需要说明的一点,就是在oracle_B处,只需对table_B表进行查询的操作,不进行其他增删改的操作。

场景介绍完了,我的问题的是,如何在oracle_A中表table_A发生变化时,实时更新同步到oracle_B的table_B中?

可行的步骤:

只需要多执行一步即可。

1:

声明一句话:

queryTEXTSIZE = str("SET TEXTSIZE 65536")

65536是我限定要返回NTEXT字段数据的最大长度,你可以设置的更大一点,比如1024000。

2:

然后执行这句sql语句:

oConn =

_mssql.connect(databaseHost,
databaseUserName, databaseUserPwd)

ret =
oConn.query(queryTEXTSIZE)

table =
oConn.fetch_array()

3:

然后,声明你的原来的那个获取NTEXT字段的sql语句如下所示:

修改的sql语句

SELECT cast ( field_name AS TEXT ) AS field_name

这个field_name所代表的字段本来类型是NTEXT,这里我们CAST它为TEXT,这就是一个技巧。

4:

接下来执行你的这个sql语句即可:

    ret = oConn.query(query)

table
= oConn.fetch_array()

 

我原来的处理方式:

通过建立远程连接DBLink+JOB定时任务+存储过程的方式,实现了定时同步更新,但不能做到实时同步

[参考资料]

1:《What means "Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library"?》

 

三. 采用同义词+DB_Link的方式结果步骤

之所以能够选择采用同义词的方式,处理这个问题。主要还是源于在问题描述中提到一个点,那就是我们只需要对同步后的表进行查询操作。这点是使用同义词方式的重要要素。

标签:, , , ,

Your Comments

近期评论

    功能


    网站地图xml地图