'보미아빠, 석이'에 해당되는 글 529건
- 2015.05.16 고향가는길
- 2015.04.30 sysprep 후 필요한것
- 2015.04.28 SQL Server 2014 BPE 를 이용한 성능향상 시나리오
- 2015.04.25 undocumented...function
- 2015.04.25 When Dirty Cache Pages Are Flushed to Disk
- 2015.04.23 데이터 마이닝
- 2015.04.23 excel linked server 메시지 7303, 수준 16, 상태 1, 줄 31 2
- 2015.04.07 Caveats of a CONTROL SERVER permission
- 2015.03.31 용량조사
- 2015.03.30 oracle procedure call
sysprep 후 필요한것
-- sysprep 하기전
-- linked server 가 있는 경우
-- windows 의 sid 가 변경된 경우 master key 를 백업 후 복원
BACKUP SERVICE MASTER KEY TO FILE = 'C:\service_master.key' ENCRYPTION BY PASSWORD = 'P@ssw0rd'
-- sysprep 후
-- 복원
RESTORE SERVICE MASTER KEY FROM FILE = 'C:\service_master.key' DECRYPTION BY PASSWORD = 'P@ssw0rd' FORCE
services.msc 에서 sql insname 확인
-- mssql$insname -> mssqlserver
-- default
net stop mssqlserver
net start mssqlserver
-- instance
net stop mssql$insname
net start mssql$insname /m /f /T3608
-- default
sqlcmd -S. -A
-- instance
sqlcmd -S.\insname -A
create login newhostname\Administrator from windows with default_database=master
go
alter server role sysadmin add member newhostname\Administrator
go
grant connect sql to newhostname\Administrator
go
alter login newhostname\Administrator enable
go
select srvname from master.dbo.sysservers where srvid = 0
go
-- default
exec sp_dropserver 'oldinstancename'
go
exec sp_addserver 'newinstancename', local
go
-- instance
exec sp_dropserver 'oldhostname\oldinstancename'
go
exec sp_addserver 'newhostname\newinstancename', local
go
SQL Server 2014 BPE 를 이용한 성능향상 시나리오
기존에 메모리가 약 10GB 이고 SATA 로 구성된 하드가 5개 달려있는데 데이터가 2TB 정도 되는 OLTP 서버가 있고 읽기가 매우 빈번한 환경이 있다고 생각해보자 ! 그런데, 우리는 SQL Server 2014 다 ! 이러면 SSD 한장 꼽으면 아무런 어플리케이션 변경없이 (5배? 디스크 최대 IOPS Vs. SSD IOPS 와 많은 메모리로 인해 데이터를 디스크와 메모리로 올리고 내리고 하는 과정을 제거할 수 있으므로)정도 성능 향상을 시킬수 있다.
기존 시나리오가 입력만 많다면 SQL Server 2014의 BPE (Buffer Pool Extention)로 효과가 없을 것이다 (쓰기가 빈번하다면 LDF 를 반드시 SSD에 두는게 유리하다. WAL(Write-Ahead Logging) 이므로 Non-volatile 디바이스에 반드시 써야 하므로). 반면, select 의 경우는 Disk 에서 한번은 느리게 읽어오겠지만 (미리 강제로 warm-up 시키는 방법도 쓸 수 있으니 뭐 별 상관없어 보인다.) 그 후는 조금 느린 메모리가 많은 시스템을 상상하면 된다. 처리 대상 대이터의 99% 가 약 100GB 정도에 존재한다면 아주 좋은 시나리오가 될것같다. 생각해보라 우리는 10GB의 물리 메모리만 있는데, 이 데이터 계속적인 페이징 아웃이 일어나면서 데이터를 읽어야 하고 이는 모두 disk i/o 가 된다. 그런데, 이것이 모두 ssd 100GB를 메모리로 인식시켜 캐시 되어주니 얼마나 이롭겠는가? 이를 가르켜 disk i/o 를 ssd로 효과적으로 오프로드 했다라고 표현한다. 그래 이것은 어떻게 하면 비용 효율적인 서버를 구성하느냐의 문제인 것이다. 모두 SSD 로 구성된 데이터베이스와 적당한 메모리를 장착한 서버가 훨씬 빠르지만! 비용을 줄이고 성능을 극대화 할 수 있는 시나리오로 보는것이 맞다.
DW의 경우 대부분이 순차읽기이고 순차쓰기가 발생하고 읽었던 데이터를 재사용하는 경우가 거의 없을 수 있다. (쿼리하는 데이터가 다르다면) 위 OLTP 시나리오와 같이 효과적이지 않을 수 있다. 그러나, 뭐 읽어야 하는 데이터가 매번 최근 데이터이고, 우리는 전체를 SSD 로 넣을 능력도 안되고, 매번 쿼리하는 데이터의 99%가 100GB 미만이다. 이러면 100GB 정도 SSD 로 BPE 기능을 써 구성하면 나는 효과가 있을 듯 하다. 물론 첫 번째는 좀 느리겠지만 뒷 쿼리들은 빨라질꺼다. 아래 링크는 똘똘한 아저씨들이 글을 잘 적어놓았으니 읽어보길 바란다. 만든이들은 DW 쿼리에 BPE를 권고하진 않는다.
하고싶은 이야기는 모두다 좋은게 없고 모두다 나쁜 경우는 없다. 적절하게 아키텍처를 이해하고 구성하면 비용 효율적으로 시스템을 구성 할 수 있다는 것이다. 뭐 계속 좋은 기능은 나오지..... 가격이........ ㅜ.ㅜ ......자꾸 비싸지니 자꾸 없어지고 결국은 어떤 서비스에서도 안쓸려고 한다. DBMS를 잘못 선택한거 아닌가 하는 생각이 자꾸드네....
https://msdn.microsoft.com/ko-kr/library/dn133176.aspx
https://msdn.microsoft.com/en-us/library/cc645993.aspx
The buffer pool extension size can be up to 32 times the value of max_server_memory for Enterprise editions, and up to 4 times for Standard edition.
undocumented...function
When Dirty Cache Pages Are Flushed to Disk
Association Rule
복수의 현상이 동시에 발생할 가능성이 높음을 찾는것
결국 동시에 발생하는 현상을 분석한다.
맥주 기저기, 와인 바비큐 그릴 등 바스켓 분석이 대표적이다.
Sequence
어떤 현상이 일어나면 다음에 다른 현상이 일어날것
분석시 시계열 데이터나 주문번호 같은것이 필요하다.
Cluster
복수의 속성을 갖는 집단의 구성요소를 비슷한 속성을 갖는 그룹(cluster)으로 나누기위한 방법
카테고리를 찾는것
예전에 산수시간에 배운 우상단을 1사분면이라고 보고 counterclockwise 로 돌면서 2,3,4 분면을 나누어 보는것이다.
예를들면 시간배분을 결정할때 긴급함을 가로축으로 두고 중요함을 세로축으로 두어 일의 중요도와 시급성을 나누어 효율적으로 일 처리를 위한 것이다. 이를 세그멘테이션이라고 부르고 가까운것을 묶어 클러스터에 의한 세그멘테이션을 나눌 수 있다.
Decision Tree
특정 상황이 발생할지를 조사해 발생결과에 대해 영향을 미치게 하는 속성의 영향도와 상호 관련성을 시각화
주요한 영향원을 분석한다. 고객의 속성별로 상품에대한 구입확율을 구한다고 가정하면, 남여 구분, 자녀유무 구분, 차량 보유여부 등을 구분해 어떤사람이 이 상품을 많이 구매한다라고 결정하고, 그 주요 원인을 분석하는 것을 말한다.
excel linked server 메시지 7303, 수준 16, 상태 1, 줄 31
64bit sql server 에 excel 2013을 링크드 서버나 직접쿼리를 할 때
일단 드라이버를 깔아야 한다. http://www.microsoft.com/en-us/download/details.aspx?id=13255
그런 후, 드라이버의 inprocess 설정을 한다.
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1
GO
계정설정
혹시 NT Service\MSSQL$SQL2012 이런식으로 되어 있으면 -> 로컬시스템으로 바꾼다. ㅠ.,ㅠ
아니면 해당 폴더에 위 계정이 액세스 가능하게 하면 될 듯 하다. appdata\local\temp 역시 권한이 필요한듯
이런거 다 귀찮으면 로컬 시스템으로 변경~
NT Service\MSSQL$SQL2012 였을때 에러 메시지
연결된 서버 "(null)"의 OLE DB 공급자 "Microsoft.ACE.OLEDB.12.0"이(가) 메시지 "지정되지 않은 오류입니다."을(를) 반환했습니다.
메시지 7303, 수준 16, 상태 1, 줄 31
연결된 서버 "(null)"에 대한 OLE DB 공급자 "Microsoft.ACE.OLEDB.12.0"의 데이터 원본 개체를 초기화할 수 없습니다.
링크드 서버 연결 명령어
/****** Object: LinkedServer [bb] Script Date: 2015-04-23 오전 11:08:34 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'bb', @srvproduct=N'ACE', @provider=N'Microsoft.ACE.OLEDB.12.0', @datasrc=N'c:\sqltag\Book1.xlsx', @provstr=N'Excel 12.0; HDR=Yes'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'bb',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
인프로세스 쿼리 방법
SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=c:\sqltag\Book1.xlsx;Extended Properties=Excel 12.0')...[Sheet1$]
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; HDR=YES; IMEX=1; Database=F:\cmdb\fault티켓\Book1.xlsx', 'SELECT * FROM [Sheet1$]')
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;
HDR=YES; IMEX=1; Database=\\127.0.0.1\f$\cmdb\fault티켓\FQ261_2011.xlsx', 'SELECT * FROM [sheet1$]')
-- 읽어보기 귀찮다.
-- 스타트 계정 로컬시스템으로 변경 후
exec sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure with override
USE [master]
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1
GO
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; HDR=YES; IMEX=1; Database=C:\event\faultPrco_2010q1.xls', 'SELECT * FROM [data$]')
Caveats of a CONTROL SERVER permission
http://www.practicalsqldba.com/2012/03/caveats-of-control-server-permission.html
재미있는 시나리오군...뭐 어짜피 control server 권한이 있다는건.....대단히 큰 권한이긴 하지....
DENY IMPERSONATE ON LOGIN::sa TO [controlserverlogin]
Sql2014에서.impersonate any login ...
-- 전체
select
sum(cast(cast(size as decimal (12,0))* 8192./1024/1024 as int)) as 'SizeMB'
from master.dbo.sysaltfiles
-- 데이터베이스 별
select
name
, cast(cast(size as decimal (12,0))* 8192./1024/1024 as int) as 'SizeMB'
, *
from master.dbo.sysaltfiles
order by 2 desc
use db
go
DBCC SHOWFILESTATS
go
-- 데이터베이스 내 테이블
create table #TableSize (
Name varchar(255),
[rows] int,
reserved varchar(255),
data varchar(255),
index_size varchar(255),
unused varchar(255)
)
create table #ConvertedSizes (
Name varchar(255),
[rows] int,
reservedKb int,
dataKb int,
reservedIndexSize int,
reservedUnused int
)
EXEC sp_MSforeachtable @command1="insert into #TableSize
EXEC sp_spaceused '?'"
insert into #ConvertedSizes (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows],
SUBSTRING(reserved, 0, LEN(reserved)-2),
SUBSTRING(data, 0, LEN(data)-2),
SUBSTRING(index_size, 0, LEN(index_size)-2),
SUBSTRING(unused, 0, LEN(unused)-2)
from #TableSize
select *
from #ConvertedSizes
order by reservedKb desc
drop table #TableSize
drop table #ConvertedSizes
-- 로그 무한증가 하는넘 찾기
select
b.name
, cast(cast(size as decimal (12,0))* 8192./1024/1024 as int) as 'SizeMB'
, log_reuse_wait_desc
, *
from master.dbo.sysaltfiles a
join master.sys.databases b
on a.dbid = b.database_id
where groupid = 0
order by 2 desc
dbcc loginfo ('db')
oracle procedure call
sqlplus user@tnsname
SQL> create or replace procedure count_emp_by_dept( pout_count out number)
2 is
3 begin
4 select count(*) into pout_count
5 from all_tables;
6 end count_emp_by_dept;
7 /
//select text from user_source where name = 'USPWORKLOADTYPECPU' -- 전부 대문자....-_-;;;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Data.OracleClient;
namespace OraTest
{
class Program
{
static void Main(string[] args)
{
SqlNetTest sqlNetTest = new SqlNetTest();
for (int i = 0; i < 5; i++)
{
sqlNetTest.execute();
}
}
}
class SqlNetTest
{
int countOut = 0;
private string ConnectionString
{
get
{
//return "Data Source=xxxxxx;Initial Catalog=xxxxx;User ID=xxxxxx;Password =xxxxx";
return "Data Source=xxx;User Id=xxx;Password=xxx;Integrated Security=no;";
}
}
public void execute()
{
this.countOut = usp_netTest(this.ConnectionString);
Console.WriteLine("all_tables counts : {0} ", this.countOut);
}
//D:\app\NAVER\product\11.2.0\client_1
private int usp_netTest(string ConnectionString)
{
int resultCnt = 0;
using (OracleConnection conn = new OracleConnection(ConnectionString))
{
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "count_emp_by_dept";
cmd.CommandType = CommandType.StoredProcedure;
//objCmd.Parameters.Add("pin_deptno", OracleType.Number).Value = 20;
cmd.Parameters.Add("pout_count", OracleType.Number).Direction = ParameterDirection.Output;
try
{
conn.Open();
cmd.ExecuteNonQuery();
resultCnt = int.Parse(string.Format("{0}",cmd.Parameters["pout_count"].Value));
}
catch (Exception ex)
{
System.Console.WriteLine("Exception: {0}",ex.ToString());
}
conn.Close();
}
return resultCnt;
}
}
}
-- odac
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
//using System.Data.OracleClient;
using Oracle.DataAccess.Client;
namespace OraTest
{
class Program
{
static void Main(string[] args)
{
SqlNetTest sqlNetTest = new SqlNetTest();
for (int i = 0; i < 5; i++)
{
sqlNetTest.execute();
}
Console.ReadKey();
}
}
class SqlNetTest
{
string result = string.Empty;
private string ConnectionString
{
get
{
//return "Data Source=test;User Id=test;Password=test";
// without tnsname
return "Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.666.6.6)(PORT = 140)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = test))); User Id = test; Password = test; Min Pool Size=500; Max Pool Size=500; Connection Timeout=60;";
}
}
public void execute()
{
this.result = usp_netTest(this.ConnectionString);
Console.WriteLine("all_tables counts : {0} ", this.result);
}
//D:\app\NAVER\product\11.2.0\client_1
//D:\app\client\NAVER\product\12.1.0\client_1
//Oracle 네트워크 구성 파일(tnsnames.ora 및/또는 sqlnet.ora)로, 다음 위치에 상주합니다.
//D:\app\NAVER\product\11.2.0\client_1\network\admin
//다음에 새로 설치된 Oracle 홈으로 복사되었습니다.
//D:\app\client\NAVER\product\12.1.0\client_1\network\admin
private string usp_netTest(string ConnectionString)
{
string result = string.Empty;
using (OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection = conn;
cmd.CommandText = "uspWorkLoadTypeCPU";
cmd.CommandType = CommandType.StoredProcedure;
//cmd.Parameters.Add("v_variable1", OracleType.Number).Value = 1;
//cmd.Parameters.Add(new OracleParameter("v_variable1", 1));
cmd.Parameters.Add("v_variable1", OracleDbType.Int32).Value = 1;
cmd.Parameters.Add("v_dbOutput", OracleDbType.NVarchar2, 100).Direction = ParameterDirection.Output;
try
{
cmd.ExecuteNonQuery();
result = string.Format("{0}", cmd.Parameters["v_dbOutput"].Value);
}
catch (Exception ex)
{
System.Console.WriteLine("Exception: {0}", ex.ToString());
Console.ReadKey();
}
}
conn.Close();
}
return result;
}
}
}