MySQL+EmbulkでBQにデータを送ってみる

MySQLのデータをBigqueryに転送する。

固定のテーブルを送信する方法は
https://qiita.com/tashiro_gaku/items/f7fa0f1a99c759d947a7
とかに書いているけどけど、やりたかったのは

1) ログ保存テーブルは、updateカラムを見て差分でBigqueryに送信する。
2) 一部のテーブルは、全レコードBigqueryに送信する。
3) 上記、1、2の対象テーブルはconfファイルを読んで動的に動かしたい
(出来れば運用側で勝手に対象テーブルの追加、削除をやって欲しい。。。)

Github

MakeJSON.py         # jsonとyamlを生成
Execue_embulk.py    # Embulk転送の実行
conf/embulk_json/   # 対象テーブルを元にBQ転送時の定義ファイルが作成される
     embulk_yaml/   # 対象テーブルを元にEmbulk実行時の定義ファイルが作成される
     keys/          # BQ接続時のjson_keyを置く
     conf.yaml      # MySQLのログイン情報、対象テーブルの情報を定義
     embulk_tmp     # Embulkのyaml生成で使うテンプレート

使い方
MakeJSON.pyの実行はいつでもいいがExecue_embulk.pyは前日分も送信するので、日付が変わってから実行する。

0 23 * * * python3 MakeJSON.py
30 0 * * * python3 Execue_embulk.py

ログシッピングの実行状態を確認する

SQLServerのログシッピングは、トランザクションバックアップの出力、コピー、リストアが別々のジョブで実行される。

デフォルトでログシッピングを作成した場合、15分間隔でジョブが作成されるが、MasterとSlaveのデータ差異が15分とは限らない為、Slave機で以下のクエリを流して同期状態を確認する。

[code]

SET NOCOUNT ON
USE master

/* DB名を入れる変数 */
DECLARE @dbname varchar(80);

/* DB一覧 */
DECLARE DBnameList CURSOR FOR
select name from sys.databases

/* sp_help_log_shipping_secondary_databaseの結果を入れる */
CREATE TABLE #TMP (
secondary_id nchar(128)
,primary_server nchar(128)
,primary_database nchar(128)
,backup_source_directory nchar(128)
,backup_destination_directory nchar(128)
,file_retention_period int
,copy_job_id nchar(128)
,restore_job_id nchar(128)
,monitor_server nchar(128)
,monitor_server_security_mode nchar(128)
,secondary_database nchar(128)
,restore_delay int
,restore_all int
,restore_mode int
,disconnect_users int
,block_size int
,buffer_count int
,max_transfer_size int
,restore_threshold int
,threshold_alert int
,threshold_alert_enabled int
,last_copied_file nchar(128)
,last_copied_date datetime2
,last_copied_date_utc datetime2
,last_restored_file nchar(128)
,last_restored_date datetime2
,last_restored_date_utc datetime2
,history_retention_period int
,last_restored_latency int
)

/* ループ処理開始 */
OPEN DBnameList;
FETCH NEXT FROM DBnameList INTO @dbname

WHILE (@@FETCH_STATUS = 0)
BEGIN
print @dbname
INSERT INTO #TMP EXEC sp_help_log_shipping_secondary_database @dbname
FETCH NEXT FROM DBnameList INTO @dbname
END

CLOSE DBnameList
DEALLOCATE DBnameList

/* 一覧出力 */

select
secondary_database as ‘DB名’
,last_copied_date as ‘最終コピー時刻’
,last_restored_date as ‘最終リストア時刻’
,last_restored_file as ‘最終リストアファイル名’
from #TMP

/* TMPDB削除 */
DROP TABLE #TMP

[/code]

wordpress をELB+EC2でHTTPS通信させる

wordpressの移設に少し手間取ったのでメモ

wordpressやELB、EC2の動かし方は割愛するが、普通のやり方。

ただ、以前に借りていたVPSでLets EncryptでHTTPS化していたブログを移設した。

ハマった所1: wp-adminのリダイレクトループ
管理画面での SSL 通信

リンク先に書いているけど、wp-includes/default-constants.phpの、

[code]
if ( !defined( ‘FORCE_SSL_ADMIN’ ) ) {
if ( ‘https’ === parse_url( get_option( ‘siteurl’ ), PHP_URL_SCHEME ) ) {
define( ‘FORCE_SSL_ADMIN’, true );
} else {
define( ‘FORCE_SSL_ADMIN’, false );
}
}
[/code]

[code]
if ( !defined( ‘FORCE_SSL_ADMIN’ ) ) {
if ( ‘https’ === parse_url( get_option( ‘siteurl’ ), PHP_URL_SCHEME ) ) {
define( ‘FORCE_SSL_ADMIN’, true );
if ( ! empty( $_SERVER[‘HTTP_X_FORWARDED_PROTO’] ) && $_SERVER[‘HTTP_X_FORWARDED_PROTO’] == ‘https’ ) {
$_SERVER[‘HTTPS’]=’on’;
}
} else {
define( ‘FORCE_SSL_ADMIN’, false );
}
}
[/code]

に変更する。

ハマった所2: WPやプラグイン更新のFTP設定
config.phpの末尾に、

[code]
define(‘FS_METHOD’,’direct’);
[/code]

を記載する。

リストア時に対象DBへのアクセスを強制的に落とす

Slave側のDBをログシッピングのStandbyモードで動かしている場合、
SSMSのユーザーセッションが残っているとリストアが失敗する事がある。

会社のとあるシステムでは、15分毎にLSCOPYを行い、深夜に1回、LSRESTOREジョブが動いているが、その良く失敗する。
酷い時は週5回は失敗して、「データが更新されてない!」と利用部門からクレームが来て手動でジョブを実行していた。

接続を切って帰ってくれればいいのだが、何度言ってもダメなので、
LSRESTOREジョブにステップを追加して、当該DBへのアクセスを全てkillする事にした。

その時に動いている処理があるのかもしれないが、ムシャクシャして書いた。

[code]
SET NOCOUNT ON
CREATE TABLE #sp_who (
spid smallint
,ecid smallint
,status nchar(30)
,loginame nchar(128)
,hostname nchar(128)
,blk char(5)
,dbname nchar(128)
,cmd nchar(16)
,request_id int)

INSERT INTO #sp_who EXEC sp_who

DECLARE CUR_SPID CURSOR FOR select spid from #sp_who where dbname = ‘DB名’

DECLARE @SPID nchar(5)

OPEN CUR_SPID

FETCH NEXT FROM CUR_SPID INTO @SPID

WHILE (@@FETCH_STATUS = 0)

BEGIN
DECLARE @command nchar(128)
SET @command = N’kill ‘ + @SPID

EXEC sp_executesql @command

FETCH NEXT FROM CUR_SPID INTO @SPID

END

CLOSE CUR_SPID
DEALLOCATE CUR_SPID
DROP TABLE #sp_who
[/code]

これで、翌朝にドタバタ&イライラしなくても済みそう。

一時テーブルにストアド結果を入れる

SQLServerで一時テーブルの作成とストアド結果をINSERTするやり方。
いつも忘れてしまうからメモ。

[code]
CREATE TABLE #sp_who (
spid smallint
,ecid smallint
,status nchar(30)
,loginame nchar(128)
,hostname nchar(128)
,blk char(5)
,dbname nchar(128)
,cmd nchar(16)
,request_id int)

INSERT INTO #sp_who EXEC sp_who

select * from #sp_who

DROP TABLE #sp_who
[/code]

dirnameが無い!?

centosでdirnameを実行すると、そんなコマンド無いよ!と怒られたのでメモ
※他のメンバーがOSインストールしたんだけど、baseだけしか入れてないのかな?

# dirname
dirname: missing operand
詳しくは `dirname –help’ を実行して下さい.

[code]
yum -y install coreutils.x86_64

[/code]

SQLServer on Linuxを触ってみる

先週、SQLServer on Linuxのpublic Public Previewが開始されたので、さっそく触ってみた。

[環境]
VirtualBOX上の CentOS7
CPU :2コア
メモリ: 4096MB ※3250MB以下は、インストール時にエラーが出ます。

インストールは、公開されているリポジトリを追加してyumコマンド叩くだけ!
非常に簡単!

[code]
# リポジトリ追加
curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo

# インストール
yum -y install mssql-server mssql-tools

# 途中、ライセンス確認のチェックが入るので、大文字でYESと入力
Do you accept the license terms? (Enter YES or NO) YES

[/code]

インストールPATHは/opt配下。
[code]
ls -1 /opt/
microsoft → odbcドライバ
mssql → SQLServer
mssql-tools → bcpとsqlcmd
[/code]

続いて、初期セットアップを行う。
[code]
/opt/mssql/bin/sqlservr-setup
(中略)
Setting system administrator (SA) account password…

Do you wish to start the SQL Server service now? [y/n]: y
Do you wish to enable SQL Server to start on boot? [y/n]: y
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server-telemetry.service to /usr/lib/systemd/system/mssql-server-telemetry.service.

Setup completed successfully.
[/code]

セットアップスクリプトが動いたっぽい。

プロセスも動いている!
mssql 2257 1 2 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr
mssql 2263 1 0 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr-telemetry /var/opt/mssql/.system
mssql 2270 2257 43 18:37 ? 00:00:04 /opt/mssql/bin/sqlservr

ポートも空いている!
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:1434 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN

最後にSSMSで接続してみます。
sqlserver_on_linux
当然、Windows認証は使えませんが、セットアップ時に決めたSAのパスワードで接続する事が出来ました。

Versionは、
Microsoft SQL Server vNext (CTP1) – 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (CentOS Linux 7 (Core))

と出ているので、インストール自体は成功したようです。

powershellでCPU情報を取得するアレコレ

[code]
# cpu情報を表示
Get-WmiObject -Class Win32_Processor

# 物理コア数を表示
Get-WmiObject -Class Win32_Processor | Format-List NumberOfCores

# 論理コア数を表示(THH)
Get-WmiObject -Class Win32_Processor | Format-List NumberOfLogicalProcessors
[/code]

と、色々と調べたけど、
[code]
Get-WmiObject -Class Win32_Processor | Format-List NumberOfCores, NumberOfLogicalProcessor
[/code]

が一番すっきりする

SQL Server から AWS Auroraにマイグレーションする時の注意事項

オンプレ環境のSQL Server開発機からAWS Auroraにマイグレーションした際、DMS(Database Migration Service)を使って見たので、ハマった処をメモ。
https://aws.amazon.com/jp/dms/

eyecatch_dms-200x200
※仕様をよく読んだら書いてあるのかもしれない。

【移設方法】
オンプレのSQLServerは、DMSからアクセスが出来ないネットワークにある為、セキュリティを弄らずに移設をする方法を考えました。
結果的に、[開発機] – [RDS for SQL Server] – [DMS] – [RDS for Aurora]
と余計なSQLServerを挟んでいます。

20161108_1

【移行時の注意点】
・DMSはスキーマ単位になりますが、Auroraはスキーマの概念がありません。
 SQLServerで
 [db_name1].[dbo].[table_name]
 [db_name2].[dbo].[table_name]
 は別テーブルとして扱われますが、Auroraでは[dbo].[table_name]と単一になります。

 その為、事前にスキーマを[ALTER SCHEMA db_name1 TRANSFER dbo.table_name]等のコマンドで変更しておく必要があります。
 対象は、一般テーブル、システムテーブルです

 また、ストアドもスキーマを変更する必要があります。
 こちらは変更のコマンドが解らなかったので、SSMSでストアドのCreate文作成 → dboの部分をdb_nameに変更して新規作成を行いました。

・LOBサイズ
 DMSのLOBサイズの上限は、デフォルトで24KBになっています。
 大きめのデータが格納されている場合、この上限に引っかかる場合がありますので、適時変更を行ってください。
 分からなくても、1024KBぐらいあれば十分かと。

・移行元がSQLServerの場合、継続的なレプリケートが出来ない。
 DMSの強みである継続的レプリケート。
 これにより、大容量のデータベースでもダウンタイムを低減させる事が出来ます。
 が、現時点でSQLServerからAuroraへは、レプリケートが行いません。

・IDENTITIYはAutoIncrimentにならない
・datetimeoffset(7) → varchar(34)
この辺はエンジンの違いが出てきます。

追加のデータが入らないうちに、Alter Tableで変更しておきましょう。

コマンドからWindowsFilewallを操作する

上手く動かねないじゃん!と思ってググった備忘録

一般的な事かもしれないけど、書き方のルールは以下の通り

  1. rule= や name=はダブルクォテーションで囲う
  2. profile=で複数プロファイルを指定する時もダブルクォテーションで囲う
  3. 既存のルールには同じ名前でプロファイルが異なる物が多い。
  4. その場合は設定変更の場合は、対象をユニークになるように指定する必要がある。
    netsh advfirewall firewall show rule name=”Windows リモート管理 (HTTP 受信)” dir=in
    → 2つある
    netsh advfirewall firewall show rule name=”Windows リモート管理 (HTTP 受信)” dir=in profile=”domain,private”
    → ユニーク
    netsh advfirewall firewall show rule name=”Windows リモート管理 (HTTP 受信)” dir=in profile=”pblic”
    → ユニーク

  5. 変更の場合は、set name=<対象の名前> <対象をユニークにする条件> new <変更後の設定> と書く
  6. netsh advfirewall firewall set rule name=”Windows リモート管理 (HTTP 受信)” dir=in profile=”domain,private” new profile=any