一、问题概述

在错误日志中看到非常多的alwayson群集只读连接错误,错误信息的描述为“目标数据库位于可用性组,当前不允许通过read
only连接”。错误日志如下:

图片 1

当前的业务系统使用监听ip对数据库进行连接,使用了ReadOnly和ReadWrite进行读写自动路由。当前alwayson的配置如下

之前有个同学问我,本地数据库插入新数据时怎么同步到服务器上,当时我先想到是程序逻辑控制,作相应的处理。

一、进入MySQL与退出MySQL

图片 2

但有时候我们程序不太好处理,那能不能从数据库入手呢,数据库不是有触发器(Trigger)吗,应该是可以的,这里就用这个来做吧。一些东西也是不太懂,网上找的资料,感谢那些人默默奉献的好人。如有误解,欢迎各位大神指正!

1.进入MySQL步骤:先打开CMD命令行;命令:C:\Users\admin> mysql
-h(域名,可填或不填) -u(账号) -p(密码);

二、问题原因

问题原因是使用了ReadOnly对主副本进行了连接操作导致的。由于当前的主角色中的连接配置的是“允许读/写连接”;所以当前主副本不允许ReadOnly的连接字符串的参数。当时这样设置的目的就是为了避免只读连接连接上主副本。防止客户错误地将读意向工作负荷连接到主副本。

 

问题原因大概有两种可能:

1.应用程序连接配置存在问题,

2.路由本身BUG

 

第一种可能的可能性比较大,但是向开发经理确认过代码那边调用的是通用连接借口,而且系统系统已经运行了一年多,而且这个问题是间隙性的,所以可以肯定接口连接配置是没有问题的,唯一的可能性是哪里单独使用的主副本的ip进行了连接。

1、首先,了解什么是触发器

连接成功时会跳出以下命令:

三、处理方法

将主角色中的连接修改为“允许所有连接”

注意:当前的这个处理方法并没有根本的解决问题。正常情况下是通过监听ip自动路由到对应的副本。

 

 

 

当前没有找到那种方法可以在数据库中查询到应用程序使用了哪种查询连接字符串参数进行连接,希望知道的朋友能告知一下。

 

 

 

 

 

 

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

 

触发器(trigger)是SQL server
提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(
insert,delete,
update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

Connection id: 9 【这个表示:连接次数】
Current database: 【这个表示:当前操作的数据库名称】
Current user: root@localhost 【这个表示:当前登录的用户 用户名@地址】
SSL: Not in use 【这个表示:是否在使用加密链接 SSL加密】
Using delimiter: ; 【这个表示:命令分隔符,结束时以分号结束】
Server version: 5.5.48 MySQL Community Server (GPL)
【这个表示:当前mysql数据库的版本型号】
Protocol version: 10 【这个表示:协议版本】
Connection: 127.0.0.1 via TCP/IP 【这个表示:连接信息】
Server characterset: utf8 【这个表示:mysql数据库管理系统的安装编码】
Db characterset: utf8 【这个表示:数据库编码】
Client characterset: utf8 【这个表示:当前客户端的默认编码】
Conn. characterset: utf8 【这个表示:当前数据库链接使用的编码】
TCP port: 3306 【这个表示:端口号】
Uptime: 7 min 11 sec
【这个表示:数据库的启动时间[距离上一次重启的时间]】

简单讲下创建trigger的语法:

2、退出MySQL:quit或exit (回车) 或者 Ctrl+C

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
 AS 
  T-SQL语句
GO

二、MySQL基础的操作

 2、怎么连接到服务器的数据库

1.创建数据库命令:mysql> create database <数据库名>

select * from sys.servers --查看当前的服务
EXEC sp_addlinkedserver
@server='black',--被访问的服务器别名(习惯上直接使用目标服务器IP,或取个别名如:black)
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='192.168.1.36', --要访问的服务器
@catalog='anmax' --数据库名称
exec sp_addlinkedsrvlogin 'black','false',null,'sa','sa123456' --(balck->前面取的别名;sa->数据库用户名;sa123456->密码)
select top 10 * from [black].[anmax].dbo.ad --测试是否成功
exec sp_droplinkedsrvlogin 'black',null --移除登陆用户
exec sp_dropserver 'black' --移除服务

2.显示所有的数据库命令:mysql> show databases (注意:最后有个s)

 3、同步插入的数据

3.删除数据库命令:mysql> drop database <数据库名>

create trigger trgtest
on product
after insert
as 
begin
--select *  from sys.servers --查看当前的服务
EXEC sp_addlinkedserver
@server='black',--被访问的服务器别名(习惯上直接使用目标服务器IP,或取个别名如:JOY)
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='192.168.1.36', --要访问的服务器
@catalog='anmax' --数据库名称
exec sp_addlinkedsrvlogin 'black','false',null,'sa','sa123456'
--执行同步代码
declare @proId int;
set @proId=@@identity;--插入的数据ID
select * into [你服务器表] from product where productid=@Proid

exec sp_droplinkedsrvlogin 'black',null
exec sp_dropserver 'black'

end

4.进入数据库命令:mysql> use <数据库名>

期间遇到些问题:开启TCP/IP协议

5.转换编码命令:mysql> set names gbk

 图片 3

6.查看当前使用的数据库命令:mysql> select database();

 

7.当前数据库所有的表信息命令:mysql> show tables (注意:最后有个s);

8.导出数据库命令:mysqldump  -h(域名)  -u(帐号)  -p(密码) 数据库名  >
 本地路径+文件名;
(注意:导出数据库前必须先要退出MySQL控制台。还有导出的文件后缀名一般都是使用
.sql)

9.导入数据库命令:首先登入MySQL控制台C:\Users\admin> mysql
-h(域名,可填或不填) -u(账号) -p(密码); 在进入数据库mysql> use
<数据库>; 在导入数据库mysql> source E:/school.sql
 (注意:source 后面是你sql文件所在的绝对路径)

10.在MySQL的表中增加字段命令:mysql> alter table <表名> add
column userid smallint not null primary key
auto_increment; 这样,就在这张表dbname中添加了一个字段userid,类型为smallint

11.删除表命令:mysql> drop table student

12.清空表命令:mysql> delete from student

13.更新表命令:mysql> update student set `name`=’小A’ where
`id`=1

 

三、表操作,操作前必须连接某个数据库

1.建表命令:create table <表名> ( <字段名1> <类型1>
[,..<字段名n> <类型n>]);

例如:

mysql> create table Student(

-> id smallint unsigned not null primary key auto_increment comment
‘注释id’,

-> name char(20) not null comment ‘注释name’,

-> sex tinyint null default “1” comment ‘注释sex[男为1,女为2]’,

->) engine = innoDB;

2.获取表结构命令:desc <表名> 或者 show columns from <表名>
还有 show create table <表名>

例如:

mysql> desc Student

mysql> show columns from Student

mysql> show create table Student

3.删除表命令:drop table <表名>

例如:

mysql> drop table Student

4.添加新数据命令:insert into <表名> ( 字段名1 , …字段名n )
values ( 值1 , …值n )。或者 insert into <表名> values(
要输入全部的数据结构 ),(注意:如需添加多条数据请用逗号隔开)

例如:

mysql> insert into Student values(1, ‘小A’ , 2), (2, ‘小B’, 1), (3,
‘小C’, 2)

5.查询表中数据命令:select <字段1,字段2,…字段n> from
<表名> where <条件>。或者 select * from <表名>

例如:

发表评论

电子邮件地址不会被公开。 必填项已用*标注