データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

1
スケジュールに従ってトランザクションログをバックアップおよび切り捨てる最良の方法
私はDBAではありませんが、DBAの帽子をかぶってSQL Serverインスタンスのメンテナンスプランをセットアップする必要があります。 だから、わたしは自分のSSISの一晩のプロセスが実行されたされてきた一方でSQLタスクを実行してバックアップを実行するために-基本的に実行されているmaster.dbo.xp_create_subdirフォルダが、その後存在し、先を確保するためにBACKUP DATABASE [DbName] TO DISK = 'G:\Backups\DbName\DbName.bak' WITH INIT。 そのタスクが失敗すると、残りのプロセスは中止され、通知が届き、翌朝、トランザクションログのドライブがいっぱいになり、手動で切り捨てて先に進みます。 ..ストーリーが繰り返され、トランザクションログが再び使用可能なディスク領域を超えてしまうまで。 「手動切り捨て」スクリプトは次のようになります。 use Staging; alter database Staging set recovery simple alter database Staging set recovery full dbcc shrinkfile ('Staging_log', 0, truncateonly); go だから私はこれに飽きてきており、代わりに適切にやってみることを決心し、ここの手順に従って実際のメンテナンス計画を作成しました: ことは、私はこれを以前に行ったことがないので、いくつか質問があります。 このようなトランザクションログをバックアップすると、自動的に切り捨てられますか、それとも他に何かする必要がありますか? データとトランザクションログのバックアップを同時に実行しても大丈夫ですか?そうでない場合、これを行う適切な方法は何ですか? バックアップファイルは、サーバー上のすべてのファイルを取得して別の場所に保存する別のプロセスによって夜間に取得されます。2日後にバックアップセットを期限切れにするのは良い考えでしょうか。それらを完全に期限切れにする必要がありますか? クリーンアップタスクは、のサブフォルダの下にある「古い」.bakファイルと.trnファイルをそれぞれ削除しますG:\Backups。それは理にかなっていますか? バックアップが失敗した場合や失敗した場合にETLを失敗させることができるように、SSISでこれを行う方が良いでしょうか?それとも私のETLプロセスは気にすべきですか? これが1つの投稿に対して多すぎる質問の場合は申し訳ありません。必要に応じて、編集して複数の質問をします。それらはすべて密接に関連していると思います。

3
PKの目的でのみ、自動インクリメント/ IDENTITYフィールドを相互参照テーブルに追加する必要がありますか?
次の相互参照テーブルをSQL ServerがホストするDBに追加します。 company_id bigint not null (FK) org_path nvarchar (2048) not null company_idフィールドはid、別のテーブルのフィールドを参照します(そのフィールドが主キーです)。 同じを持つ複数のレコードも存在する可能性があることを考えるとcompany_id、主キーは両方のフィールドを使用する必要があります。ただし、org_pathSQL Serverには長すぎるため、両方のフィールドを使用してキーを作成できません。 に関してはorg_path、これが存在する唯一のテーブルです。このテーブルへのクエリがすべてのエントリまたはすべてのorg_pathエントリのいずれかを要求する可能性はほとんどありませんcompany_id。別の言い方をすると、このテーブルがによってクエリされることは疑わしいようorg_pathです。さらに、org_path更新される可能性は低く、おそらく挿入され、おそらく削除されることはほとんどありません。 行の総数は数千になると思います。 また、その理由nvarchar (2048)は、値がサードパーティのDBの値を模倣する必要があるためです。典型的な例は次のようになります \Translation Providers\[customer name]\[order name]\ 分音符号を含めることができます。 だから私の質問はこれです:自動インクリメントidフィールドを追加しcompany_idてそれを主キーとして使用する方が効率的ですか、それとも不必要なオーバーヘッドが追加されますか-そしてcompany_id、別のテーブルの主キーであるという事実にはここで効果?

1
インジェクション攻撃から保護するためにQUOTENAMEを引き続き使用する必要がありますか?
今日、古いストアドプロシージャを見ていquotenameて、入力パラメーターで使用されていることに気付きました。それが何をしているのかを正確に理解するために少し掘り下げた後、私はこのサイトを見つけました。私はそれが何をするか、そしてそれをどのように使うかを理解しました、しかしサイトはそれがSQLインジェクション攻撃からの緩和として使われると言います。asp.netを使用してデータベースを直接クエリするアプリを開発していたときは、ADO.Netパラメータを使用してユーザー入力をリテラル値として渡し、ストアドプロシージャでそれを保護することについて心配することはありませんでした。 現在、自分が記述し​​ていないアプリケーションで使用されるストアドプロシージャを記述しているので、プロシージャレベルでインジェクション攻撃から保護する必要quotenameがあります。これは、これを行うための最良の方法であるか、より新しい機能/優れた方法があります。方法? この思考パターンに私を導いたコード(@parm1ユーザー入力パラメーターです): 'SELECT project [Project], project_desc [Description], customer [Customer], cpnyid [Company] FROM PJPROJ (nolock) where project like ' + quotename(@parm1,'''') + '

4
英数字文字列の文字と数字を区切る
入力として英数字の文字列があり、それから2つの結果を取得したいと思います。 すべての数字が削除された文字列 そして 入力文字列のすべての数字の合計である整数。 たとえば、この入力の場合: GR35hc7vdH35 次の出力が必要です。 | Col1. | Col2 | ---------------------------------- | GRhcvdH | 23 | どうすればできますか?

2
hierarchyid CLRはオープンソースですか?
組み込みのhierarchyidは、パスを効率的なバイナリ形式で格納し、その他の便利な機能を提供するCLRです。 残念ながら、表現されたパスの深さには制限があり、バイナリツリーの場合は〜1427です。この制限に達することになっている複雑な既存のアプリケーションの制限を増やしたいと思います。タイプのインターフェースを変更したくありません。結果として変更する必要のあるすべてのコードに微妙なバグを導入せずに、型のインターフェイスを変更できるとは思えません。 (理論的には)hierarchyidと同じインターフェイスを実装する「binhierarchyid」CLR UDTを作成できますが、バイナリツリーのみをサポートします。これにより、900バイトの制限内にとどまったまま、深度が7000に達するはずです。それがどれほどの規模の事業になるかはわかりません。 このhierarchyid CLRのソースはどこかにありますか?

3
実行プランはINDEXを使用せず、テーブルスキャンを使用します
インデックスまたはテーブルスキャンを使用する場合、SQL Serverは統計を使用してどちらが優れているかを確認します。 2,000万行のテーブルがあります。(SnapshotKey、Measure)のインデックスと次のクエリがあります。 select Measure, SnapshotKey, MeasureBand from t1 where Measure = 'FinanceFICOScore' group by Measure, SnapshotKey, MeasureBand クエリは500k行を返します。したがって、クエリはテーブルの行の2.5%のみを選択します。 問題は、SQL Serverが私が持っている非クラスター化インデックスを使用せず、代わりにテーブルスキャンを使用する理由です。 統計を更新しました。 ただし、クエリのパフォーマンスは良好です。 テーブルスキャン 強制インデックス テーブル/インデックス構造 CREATE TABLE [t1]( [SnapshotKey] [int] NOT NULL, [SnapshotDt] [date] NOT NULL, [Measure] [nvarchar](30) NOT NULL, [MeasureBand] [nvarchar](30) NOT NULL, -- and many more fields …

1
tempdbバージョンストアに関する質問
今日、エラーに遭遇しました: エラー:3967、重大度:17 そして私が言うことができることから、それは基本的に「フルバージョンストア」です。私の店ではこれまでこのエラーに遭遇したことがないので、これは私が答えることが困難であったいくつかの質問を引き起こしました: 事前設定された最大サイズ(tempdbの合計サイズなどに基づく)がある場合、それは動的ですか? 動的でない場合に動的にする設定はありますか? これに基づいてアラートを設定できますか?(すなわち、サイズの追跡などに使用するDMV)

1
MSDBデータベースはなぜ信頼できるのですか?
TRUSTWORTHY注意しないと、この設定はかなり危険になる可能性があり、特定の状況を除いて、オフにしておくことをお勧めします。ただし、デフォルトでは、MSDBデータベースはデフォルトでTRUSTWORHTY設定さONれています。なぜだろう? このエントリをBOLで読みました 注デフォルトでは、MSDBデータベースのTRUSTWORTHY設定はONに設定されています。この設定をデフォルト値から変更すると、MSDBデータベースを使用するSQL Serverコンポーネントで予期しない動作が発生する可能性があります。 しかし、私は詳細に興味があります。なぜ具体的にオンにMSDBする必要TRUSTWORTHYがあるのですか?どの関数がそれを使用しますか?

1
友情データベース構造の設計:複数値列を使用する必要がありますか?
User_FriendList次の特性を持つと呼ばれるテーブルがあるとします。 CREATE TABLE User_FriendList ( ID ..., User_ID..., FriendList_IDs..., CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID) ); また、上記の表に次のデータが含まれているとします。 + ---- + --------- + --------------------------- + | ID | User_ID | Friendlist_IDs | + ---- + --------- + --------------------------- + | 1 | 102 | 2:15:66:35:26:17:| + ---- + --------- + --------------------------- + …

4
SQLバックアップとITの通常の夜間サーバーバックアップとの違いは何ですか?
IT部門は毎晩サーバー全体をバックアップし(SQL Serverインスタンスがこのサーバーにインストールされています)、何か問題が発生した場合に備えて、サーバー全体とネットワーク全体をバックアップします... それで、私のマネージャーは、IT部門がバックアップするものに対して、フル、差分、およびログSQLバックアップの重要性を尋ねました。これらのファイルを2週間保持して削除するのではなく、サーバーのスペースを節約するために、IT部門が提供するだけだと考えています。 私はそれが正しくないことを知っています。ログバックアップで過去30分間まで復元できるため、ITは翌日にそれを復元しますが、これが唯一の違いですか? データベースバックアップファイルを同じサーバーに保存/送信するので、ITはそれらを復元しますが、メンテナンスプランにこれらのバックアップジョブがない場合、テーブル、トランザクションなしでSQLインスタンスを復元できます...等私はこれを正しくしていますか? 何かアドバイスをいただければ幸いです。

1
自己終了を開始するSQL Serverエージェント
先月、私のサーバーの1つでSQL Serverエージェントの問題が発生しています。ランダムに発生する以下のエラーで自動的に停止します。 SQLエージェント出力ファイル [097]メモリリークが検出されました[204バイト] 例外5がファイルe:\ sql9_sp2_t \ sql \ komodo \ src \ core \ sqlagent \ src \ alerter.cppの行403でキャッチされました。自己終了を開始するSQLServerAgent 私はこのエラーをググりましたが、それについて多くの情報を得ませんでした。SQL Serverとエージェントの両方が同じドメインアカウントで実行されています。ただし、問題はSQL Serverエージェントサービスでのみ発生します。 SQL Server構成マネージャーでSQL Serverエージェントサービスを表示することもできません。SQL ServerのエラーログとWindowsイベントビューアのログを確認しましたが、不審なアクティビティは確認されませんでした。 私のメモリ設定は正しく構成されています。サーバーには32GBのRAMがあり、SQL Serverは26GBの最大メモリを使用するように割り当てられています。 システムの詳細: SQL Server 2012 SP2 Std Edition 11.0.5058 64ビット Windows Server 2008 R2 Ent Edition 64ビット SQL Server専用(サーバー上で他のアプリは実行されません) サーバーは数か月前にSQL Server 2005 …

1
SQL Server-主キーなしで大きなテーブルをエクスポートする
SQL ServerとMySQLの間で主キーなしで約5億行の大きなテーブルを同期する必要があります。テーブルには、クラスター化された複合非一意インデックスのみがあります。 サーバー間にODBC接続がありますが、約800万行のインポートには約45分かかりました。そのため、いつでも中断が発生する可能性があるため、単一の大きなインポートは無理があると思います。既存のテーブル構造を変更できません。他のテーブルを追加できます。さらに読んだ後、オフセット/フェッチは大きなテーブルのオプションではありません。「選択... where where between ... and ...」は、一意のキーがないためオプションではありません。 すべての行を含むことが保証されているバッチでテーブルをエクスポートするにはどうすればよいですか?私の問題は、クラスター化されたキーが一意ではないため、物理的な行が連続するクエリ間で同じ順序になることを保証しない後の順序付けと、すべての列に時間がかかりすぎる場合の順序付けです。また、ODBCまたはCSVファイルを使用して、バッチをどのように移行することをお勧めしますか?

2
データウェアハウス:毎日のスナップショットを照会するにはどうすればよいですか?
時系列ではないデータベースのスナップショットがいくつかあります。例えば: スナップショット1日目: +----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+ スナップショット2日目(新しい投稿が今日追加されます): +----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 …

2
オフラインのCPUスケジューラ
新しいクライアントシステムにログオンし、sp_blitzを実行して、何が振動しているかを確認しました。それは私にとって新しいものである「CPU Schedulers Offline」を報告します。 一部のCPUコアは、アフィニティマスキングまたはライセンスの問題のため、SQL Serverにアクセスできません。 十分に公平です。基本クエリを実行します SELECT DOS.is_online , DOS.status , DOS.* FROM sys.dm_os_schedulers AS DOS ORDER BY 1; それは、私が8をVISIBLE OFFLINEに、43をオンラインに設定したことを報告しています。私の知る限り、このクライアントの誰も意図的にCPUアフィニティを設定していません。 私はそれを解き放つことができるかどうかを確認することにしました。プロパティウィンドウを見ると、40のプロセッサが利用可能で、どれもアフィニティを持つように設定されていません。 is_onlineがtrueであるdm_os_schedulersにまだ40の表示が43のエントリがある理由は、好奇心が強いようです。8オフラインのcpu_idは32〜39です。 sys.configurationsが明示的にオンになっていないアフィニティと一致するようです name value value_in_use description affinity I/O mask 0 0 affinity I/O mask affinity mask 0 0 affinity mask affinity64 I/O mask 0 0 affinity64 I/O mask …

2
pgpoolアーキテクチャを備えたPostgres
以下はpgpoolアーキテクチャの例です: これは、単一のサーバーにpgpoolを置くだけでよいことを意味します。これは本当ですか?構成を見ると、内でバックエンドを構成していることもわかりますpgpool.conf。これはさらにこれを意味します。ただし、バックエンドサーバーでもpgpoolが表示される理由は説明されていません。 見ているときのドキュメント私はまた、以下を参照してください。 PostgreSQL 8.0以降を使用している場合は、pgpool-IIが内部で使用するため、pgpool-regclass関数をpgpool-IIがアクセスするすべてのPostgreSQLにインストールすることを強くお勧めします。 だから私は何を考えればいいのかわかりません。すべてのバックエンドまたは専用サーバーにpgpoolを配置することがベストプラクティスである場合

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.