GLOBAL_NAMES参数研究

本文详细解析了Oracle数据库中GLOBAL_NAMES参数的作用及其与DBLINK之间的关系,通过实例展示了如何配置和使用GLOBAL_NAMES参数来限制或允许DBLINK的创建,以及在不同配置下DBLINK工作的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在配置Stream时,发现必须要把GLOBAL_NAMES参数的指设置为TRUE,具体原因为何不知。但是发现在设置了该参数之后,数据库每天的物化视图刷新出现了问题。之后查明原因,是DBLINK出现了问题。随后研究了一下GLOBAL_NAMES这个参数,发现其实很有意思的事情是:GLOBAL_NAMES参数并不是用来控制GLOBAL_NAME的,而是用来限制DBLINK的使用。下面简单了解一下这个参数:
 
    GLOBAL_NAMES参数的作用,简单得说来就是:当GLOBAL_NAMES参数设置为TRUE时,使用DBLINK的名称必须与被连接库的GLOBAL_NAME一致。本来是想做几个简单的测试,但是发现网上已经有人写过了,想想要再配置数据库也比较麻烦,就直接拷过来了:
 
************************************************************************************
当GLOBAL_NAMES参数设置为TRUE时,使用DATABASE LINK时,DATABASE LINK的名称必须与被连接库的GLOBAL_NAME一致。下面做一个测试,在测试中,创建数据库链接的库为XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1),被链接的库为DMDB(LINUX AS5 ORACLE 10g 10.2.0.1 RAC)
 
首先查看DMDB的相关配置:
 
SQL> show parameter global_names
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
global_names                         boolean     FALSE

SQL> select * from global_name;;
 
GLOBAL_NAME
----------------------------------------------------------
DMDB
 
可以看到这个被链接的库其global_names参数为FALSE。
 
要创建数据库链接的库的配置:
 
SQL> show parameter global_names
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- -------
global_names                         boolean     FALSE
SQL> select * from global_name;
 
GLOBAL_NAME
--------------------------------------------------------
XJ
 
然后做下面的操作:
 
SQL> create database link test_link connect to test identified by test using 'DMDB';
 
数据库链接已创建。
 
SQL> select * from dual@test_link ;
 
D
-
X
 
可以看到数据库链接工作正常。
 
在DMDB库上将global_names设为TRUE:
 
SQL> alter system set global_names=true;
 
系统已更改。
 
在XJ库上再次查询,并新建一个DATABASE LINK再进行查询:
 
SQL> select * from dual@test_link ;
 
D
-
X
 
SQL> create database link test_link2 connect to test identified by test using 'DMDB';
 
数据库链接已创建。
 
SQL> select * from dual@test_link2 ;
 
D
-
X
 
此时可以看数据库链接工作正常。我们再将XJ库的global_names参数设置为TRUE:
 
SQL> alter system set global_names=true;
 
系统已更改。
 
SQL> select * from dual@test_link2 ;
select * from
dual@test_link2
                   *
第 1 行出现错误:
ORA-02085: 数据库链接 TEST_LINK2 连接到 DMDB
 
SQL> select * from dual@test_link
select * from dual@test_link
                   *
第 1 行出现错误:
ORA-02085: 数据库链接 TEST_LINK 连接到 DMDB
 
而再次将XJ库的global_names设为FALSE,则数据库链接又可用了。
SQL> alter system set global_names=false;
 
系统已更改。
 
SQL> select * from dual@test_link ;
 
D
-
X
 
SQL> select * from dual@test_link2 ;
 
D
-
X
 
再将DMDB库的global_names设为FALSE,数据库链接仍然可用:
 
在DMDB库上:
 
SQL> alter system set global_names=false;
 
系统已更改。
 

在XJ库上:
 
SQL> select * from dual@test_link ;
 
D
-
X
 
可以看到,链接仍然可以用。
如果在DMDB库上创建链接到XJ库上,可以观察到同样的结果。
可以得出一个结论:global_names参数设置为FALSE,影响的是创建数据库链接的那个库对数据库链接的使用。也就是说,如果一个库(实例)的global_names参数设值为TRUE,则该库连接其他库的数据库链接,其名称必须要与被连接的库的global_name相同:
 
在XJ库上:
 
SQL> alter system set global_names=true;
 
系统已更改。
 
SQL> create database link dmdb connect to test identified by test using 'dmdb';
 
数据库链接已创建。
 
SQL> select * from dual@dmdb ;
 
D
-
X
SQL> select * from
dual@test_link ;
select * from
dual@test_link
*
第 1 行出现错误:
ORA-02085: 数据库链接 TEST_LINK 连接到 DMDB
 

SQL> select * from dual@test_link2 ;
select * from
dual@test_link2
                   *
第 1 行出现错误:
ORA-02085: 数据库链接 TEST_LINK2 连接到 DMDB
 

如果在GLOBAL_NAMES设置为TRUE的情况下,如果要建多个数据库链接到同一个库,怎么办呢?因为数据库链接的名称必须与目标库的GLOBAL_NAME相同。可以按如下的方法:
 
SQL> create database linkdmdb@link1connect to test identified by test using 'dmdb';
 
数据库链接已创建。
 
SQL> create database linkdmdb@link2connect to test identified by test using 'dmdb';
 
数据库链接已创建。
 
SQL> select * fromdual@dmdb ;
 
D
-
X
 
SQL> select * fromdual@dmdb@link1 ;
 
D
-
X
 
SQL> select * fromdual@dmdb@link2 ;
 
D
-
X
 
也就是在GLOBAL_NAME后面加上@再加上一个标识。这样就能够创建多个数据库链接到同一目标库上了。
 
另外在创建数据库链接时,不能给其他SCHEMA创建链接,这是因为数据库链接(database link)其名称可以含有'.'即点号。比如A用户想给B用户创建一个DBLINK名叫LINKB,CREATE DATABASE LINK B.LINKB ......, 这个语句将会实际创建一个A用户下的名为B.LINKB的数据库链接。
******************************************************************************************************
 

转载于:https://www.cnblogs.com/songdavid/articles/2167064.html

import numpy as np import matplotlib.pyplot as plt import squarify from matplotlib.path import Path import matplotlib.patches as patches import matplotlib.colors as mcolors plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 # ================== 数据定义 ================== # 一级指标 level1_names = ['数字化意识', '数字技术知识与技能', '数字化应用', '数字社会责任', '专业发展'] # 二级指标名称 level2_names = [ ['数字化认识', '数字化意愿', '数字化意志'], ['数字技术概念', '数字技术操作', '数字工具选择'], ['数字化教学设计', '数字化教学实施', '数字化学业评价', '数字化协同育人'], ['法治道德规范', '数字安全保护'], ['数字化学习', '数字化研究', '数字创新能力'] ] # 二级指标局部权重 local_weights = [ [0.5390, 0.2973, 0.1638], [0.1638, 0.2973, 0.5390], [0.0960, 0.1611, 0.2771, 0.4658], [0.3333, 0.6667], [0.1638, 0.2973, 0.5390] ] # 一级指标权重 level1_weights = [0.1250, 0.2147, 0.3751, 0.0741, 0.2147] # 计算全局权重 global_weights = [] for i in range(5): global_weights.extend(np.array(local_weights[i]) * level1_weights[i]) global_weights = np.array(global_weights) # 计算二级指标总数 total_secondary = sum(len(sub) for sub in level2_names) # ================== 1. 树状图 ================== plt.figure(figsize=(14, 10)) # 准备树状图数据 all_weights = level1_weights.copy() for i, weights in enumerate(local_weights): all_weights.extend(np.array(weights) * level1_weights[i]) all_labels = level1_names.copy() for names in level2_names: all_labels.extend(names) # 生成颜色映射 colors = plt.cm.tab20c(np.linspace(0, 1, len(all_labels))) cmap = plt.get_cmap('tab20c') level1_colors = cmap([0.05, 0.25, 0.45, 0.65, 0.85]) # 创建嵌套树状图 ax = plt.subplot(111) squarify.plot(sizes=all_weights, label=all_labels, color=colors, alpha=0.8, text_kwargs={'fontsize': 10}) plt.axis('off') plt.title('高校教师数字胜任力指标权重树状图', fontsize=16) plt.tight_layout() plt.savefig('树状图.png', dpi=300, bbox_inches='tight') plt.close() # # ================== 3. 雷达图 ================== plt.figure(figsize=(8, 8)) ax = plt.subplot(111, polar=True) # 数字化应用指标数据 b3_weights = local_weights[2] b3_labels = level2_names[2] # 闭合数据 angles = np.linspace(0, 2 * np.pi, len(b3_labels), endpoint=False).tolist() angles += angles[:1] b3_weights += b3_weights[:1] # 绘制雷达图 ax.plot(angles, b3_weights, 'o-', linewidth=2, color='dodgerblue') ax.fill(angles, b3_weights, color='skyblue', alpha=0.4) # 设置标签 ax.set_theta_offset(np.pi / 2) ax.set_theta_direction(-1) ax.set_thetagrids(np.degrees(angles[:-1]), labels=b3_labels) # 设置网格和标题 ax.set_rlabel_position(0) plt.yticks([0.1, 0.2, 0.3, 0.4], ["0.1", "0.2", "0.3", "0.4"], color="grey", size=7) plt.ylim(0, 0.5) plt.title('数字化应用局部权重雷达图', fontsize=14, pad=20) plt.tight_layout() plt.savefig('雷达图.png', dpi=300) plt.close() # ================== 4. 哑铃图 ================== plt.figure(figsize=(10, 10)) # 准备数据 - 确保长度一致 local_values = [] for weights in local_weights: local_values.extend(weights) dumbbell_labels = [] for names in level2_names: dumbbell_labels.extend(names) # 确保所有数组长度相同 min_length = min(len(local_values), len(global_weights), len(dumbbell_labels)) local_values = local_values[:min_length] global_weights = global_weights[:min_length] dumbbell_labels = dumbbell_labels[:min_length] # 绘制哑铃图 y_pos = np.arange(min_length) plt.hlines(y=y_pos, xmin=local_values, xmax=global_weights, color='gray', alpha=0.4, linewidth=2) plt.scatter(local_values, y_pos, color='skyblue', s=100, label='局部权重', alpha=0.8, edgecolor='black') plt.scatter(global_weights, y_pos, color='tomato', s=100, label='全局权重', alpha=0.8, edgecolor='black') # 添加标签和标题 plt.yticks(y_pos, dumbbell_labels, fontsize=9) plt.xlabel('权重值') plt.title('局部vs全局权重哑铃图', fontsize=14) plt.legend(loc='lower right') plt.grid(axis='x', linestyle='--', alpha=0.7) plt.tight_layout() plt.savefig('哑铃图.png', dpi=300, bbox_inches='tight') plt.close() # ================== 5. 气泡图 ================== plt.figure(figsize=(12, 8)) # 准备气泡图数据 groups = [] ranks = [] sizes = [] colors = [] group_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'] # 使用全局权重索引 counter = 0 for i, names in enumerate(level2_names): for j in range(len(names)): groups.append(i) ranks.append(j + 1) sizes.append(global_weights[counter] * 3000) colors.append(group_colors[i]) counter += 1 # 绘制气泡图 for i in range(len(level1_names)): mask = np.array(groups) == i plt.scatter(np.array(ranks)[mask], [i] * sum(mask), s=np.array(sizes)[mask], c=np.array(colors)[mask], alpha=0.7, edgecolors='black', label=level1_names[i]) # 添加标签 for i, label in enumerate(dumbbell_labels): plt.annotate(label, (ranks[i], groups[i] + 0.1), xytext=(0, 5), textcoords='offset points', ha='center', fontsize=9) # 设置标题和坐标轴 plt.yticks(range(len(level1_names)), level1_names) plt.xlabel('指标排名') plt.title('二级指标气泡图', fontsize=14) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.legend(loc='best', title='一级指标') plt.tight_layout() plt.savefig('气泡图.png', dpi=300) plt.close() print("所有可视化图表已生成并保存为PNG文件") 将树状图中的文字放大
07-22
import numpy as np import matplotlib.pyplot as plt import squarify import matplotlib.patches as patches # 配置中文字体(确保所有环境兼容) plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Heiti TC', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 数据定义(一级+二级指标及权重) level1 = { 'names': ['数字化意识', '数字技术知识与技能', '数字化应用', '数字社会责任', '专业发展'], 'weights': [0.1250, 0.2147, 0.3751, 0.0741, 0.2147] } level2 = [ { 'names': ['数字化认识', '数字化意愿', '数字化意志'], 'weights': [0.5390, 0.2973, 0.1638], 'global_weights': [0.1250*0.5390, 0.1250*0.2973, 0.1250*0.1638] }, { 'names': ['数字技术概念', '数字技术操作', '数字工具选择'], 'weights': [0.1638, 0.2973, 0.5390], 'global_weights': [0.2147*0.1638, 0.2147*0.2973, 0.2147*0.5390] }, { 'names': ['数字化教学设计', '数字化教学实施', '数字化学业评价', '数字化协同育人'], 'weights': [0.0960, 0.1611, 0.2771, 0.4658], 'global_weights': [0.3751*0.0960, 0.3751*0.1611, 0.3751*0.2771, 0.3751*0.4658] }, { 'names': ['法治道德规范', '数字安全保护'], 'weights': [0.3333, 0.6667], 'global_weights': [0.0741*0.3333, 0.0741*0.6667] }, { 'names': ['数字化学习', '数字化研究', '数字创新能力'], 'weights': [0.1638, 0.2973, 0.5390], 'global_weights': [0.2147*0.1638, 0.2147*0.2973, 0.2147*0.5390] } ] # 生成颜色方案 cmap = plt.get_cmap('tab20c') level1_colors = cmap([0.05, 0.25, 0.45, 0.65, 0.85]) # 创建画布(更大尺寸避免文字重叠) fig = plt.figure(figsize=(22, 18)) ax = fig.add_subplot(111) # 关键修正:为squarify.layout()提供必选参数(x, y, dx, dy) # x, y: 起始坐标;dx, dy: 总宽度和高度 level1_layout = squarify.layout( sizes=level1['weights'], x=0, # 起始x坐标 y=0, # 起始y坐标 dx=100, # 总宽度 dy=100 # 总高度 ) # 绘制一级指标 level1_patches = [] for i, rect in enumerate(level1_layout): x, y, dx, dy = rect # 从布局中提取坐标和大小 level1_patches.append(rect) # 绘制一级矩形 patch = patches.Rectangle( (x, y), dx, dy, facecolor=level1_colors[i], alpha=0.8, edgecolor='white', linewidth=2 ) ax.add_patch(patch) # 一级标签(名称+权重) label_text = f"{level1['names'][i]}\n{level1['weights'][i]:.4f}" ax.text( x + dx/2, y + dy/2, label_text, ha='center', va='center', fontsize=22, fontweight='bold', color='black' ) # 绘制二级指标(嵌套在一级内) for i, (x, y, dx, dy) in enumerate(level1_patches): sub_data = level2[i] sub_names = sub_data['names'] sub_weights = sub_data['weights'] sub_global = sub_data['global_weights'] # 二级布局(必选参数:在一级指标的范围内绘制) sub_layout = squarify.layout( sizes=sub_weights, x=x, # 继承一级的x坐标 y=y, # 继承一级的y坐标 dx=dx, # 继承一级的宽度 dy=dy # 继承一级的高度 ) # 二级颜色(基于一级颜色渐变) base_color = level1_colors[i] sub_colors = np.array([base_color * 0.9, base_color * 0.8, base_color * 0.7, base_color * 0.6])[:len(sub_names)] # 绘制二级矩形和标签 for j, (sx, sy, sdx, sdy) in enumerate(sub_layout): # 二级矩形 sub_patch = patches.Rectangle( (sx, sy), sdx, sdy, facecolor=sub_colors[j], alpha=0.9, edgecolor='white', linewidth=1.5 ) ax.add_patch(sub_patch) # 二级标签(名称+全局权重) label_text = f"{sub_names[j]}\n{sub_global[j]:.4f}" ax.text( sx + sdx/2, sy + sdy/2, label_text, ha='center', va='center', fontsize=18, color='black' ) # 图表设置 ax.set_xlim(0, 100) ax.set_ylim(0, 100) ax.axis('off') # 隐藏坐标轴 fig.suptitle( '高校教师数字胜任力指标权重树状图', fontsize=26, fontweight='bold', y=0.96 ) # 保存图片 plt.tight_layout() plt.savefig('高校教师数字胜任力_树状图_最终版.png', dpi=300, bbox_inches='tight') plt.close() print("✅ 最终版树状图已生成!文件:高校教师数字胜任力_树状图_最终版.png") 运行不了,改一下
最新发布
07-22
import pandas as pd import numpy as np import paddle import paddlenlp import os import time from paddlenlp.transformers import AutoModelForSequenceClassification, AutoTokenizer from paddlenlp.datasets import DatasetBuilder from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, accuracy_score, f1_score, recall_score, precision_score # 参数配置 MODEL_NAME = 'ernie-3.0-medium-zh' BATCH_SIZE = 32 MAX_SEQ_LENGTH = 128 EPOCHS = 5 SEED = 42 CKPT_DIR = "ernie_ckpt" # 固定随机种子 np.random.seed(SEED) paddle.seed(SEED) # 1. 数据准备 df = pd.read_excel('模型语库_4.xlsx') print("类别分布:\n", df["是否进行数字化转型"].value_counts()) # 划分数据集 train_df, temp_df = train_test_split(df, test_size=0.2, stratify=df["是否进行数字化转型"], random_state=SEED) val_df, test_df = train_test_split(temp_df, test_size=0.5, stratify=temp_df["是否进行数字化转型"], random_state=SEED) print(f"训练集: {len(train_df)}, 验证集: {len(val_df)}, 测试集: {len(test_df)}") # 2. 创建Paddle数据集 tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) def convert_example(example): encoded_inputs = tokenizer( example["分割的句子"], max_seq_len=MAX_SEQ_LENGTH, padding='max_length', truncation=True ) return { "input_ids": encoded_inputs["input_ids"], "token_type_ids": encoded_inputs["token_type_ids"], "labels": example["是否进行数字化转型"] } class CustomDataset(DatasetBuilder): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): return convert_example(self.data.iloc[idx]) # 创建数据集和数据加载器 def collate_fn(batch): input_ids = paddle.to_tensor([item["input_ids"] for item in batch]) token_type_ids = paddle.to_tensor([item["token_type_ids"] for item in batch]) labels = paddle.to_tensor([item["labels"] for item in batch]) return input_ids, token_type_ids, labels train_dataset = CustomDataset(train_df) val_dataset = CustomDataset(val_df) test_dataset = CustomDataset(test_df) train_loader = paddle.io.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, collate_fn=collate_fn) val_loader = paddle.io.DataLoader(val_dataset, batch_size=BATCH_SIZE, collate_fn=collate_fn) test_loader = paddle.io.DataLoader(test_dataset, batch_size=BATCH_SIZE, collate_fn=collate_fn) # 3. 模型定义 model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_classes=2) # 4. 训练配置 optimizer = paddle.optimizer.AdamW(learning_rate=1e-4, parameters=model.parameters()) criterion = paddle.nn.loss.CrossEntropyLoss() metric = paddle.metric.Accuracy() # 评估函数 def evaluate(model, data_loader): model.eval() all_preds, all_labels = [], [] with paddle.no_grad(): for batch in data_loader: input_ids, token_type_ids, labels = batch logits = model(input_ids, token_type_ids) preds = paddle.argmax(logits, axis=1) all_preds.extend(preds.numpy().tolist()) all_labels.extend(labels.numpy().tolist()) return ( accuracy_score(all_labels, all_preds), f1_score(all_labels, all_preds), precision_score(all_labels, all_preds), recall_score(all_labels, all_preds) ) # 5. 训练循环 global_step = 0 best_f1 = 0 tic_train = time.time() for epoch in range(EPOCHS): model.train() for step, batch in enumerate(train_loader, start=1): input_ids, token_type_ids, labels = batch logits = model(input_ids, token_type_ids) loss = criterion(logits, labels) # 反向传播 loss.backward() optimizer.step() optimizer.clear_grad() # 更新指标 correct = metric.compute(logits, labels) metric.update(correct) global_step += 1 # 每10步打印训练信息 if global_step % 10 == 0: acc = metric.accumulate() metric.reset() speed = 10 / (time.time() - tic_train) tic_train = time.time() print(f"global step {global_step}, epoch: {epoch+1}, batch: {step}, " f"loss: {loss.numpy().item():.5f}, acc: {acc:.5f}, speed: {speed:.2f} step/s") # 每40步进行验证 if global_step % 40 == 0: val_acc, val_f1, val_precision, val_recall = evaluate(model, val_loader) print(f"Evaluation @ step {global_step}: val_acc: {val_acc:.5f}, val_f1: {val_f1:.5f}, " f"val_precision: {val_precision:.5f}, val_recall: {val_recall:.5f}") # 保存最佳模型 if val_f1 > best_f1: best_f1 = val_f1 if not os.path.exists(CKPT_DIR): os.makedirs(CKPT_DIR) paddle.save(model.state_dict(), os.path.join(CKPT_DIR, "best_model.pdparams")) tokenizer.save_pretrained(CKPT_DIR) print(f"Saved best model @ step {global_step} with val_f1: {best_f1:.5f}") # 6. 最终测试评估(修正后) print("\nTesting best model...") model.load_dict(paddle.load(os.path.join(CKPT_DIR, "best_model.pdparams"))) # 正确收集测试数据 test_preds, test_labels = [], [] model.eval() with paddle.no_grad(): for batch in test_loader: input_ids, token_type_ids, labels = batch logits = model(input_ids, token_type_ids) preds = paddle.argmax(logits, axis=1) test_preds.extend(preds.numpy().tolist()) test_labels.extend(labels.numpy().tolist()) # 生成分类报告 print("测试集分类报告:") print(classification_report(test_labels, test_preds, target_names=['非转型', '转型'])) 如何在论文中阐述解释这段代码,并绘制算法图
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值