データベース管理者

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

4
SQL Server 2008 R2の圧縮後にログファイルサイズを手動で設定する
その瞬間、やや不本意なDBAになり、何かの助けが本当に必要です。 フルリカバリモードで40GBのデータベースがあり、ログバックアップが構成されておらず、84GBの巨大なログファイルがあります。これまでのところ、この状況を回避するための私の計画は、データベースで完全なログバックアップを実行し、ログファイルを圧縮し、データベースバックアップを使用してログバックアップを毎晩実行し、制御を維持できるように保守計画を推進することです。 私の問題は、ログファイルを何も縮小しないで、月曜日の最初の朝を絶えず成長させておくことです。ファイルがどうあるべきか(データベースの約20%)については大まかな見積もりがあり、できる限り多くの連続したスペースを確保するために、最初から設定します。これは、データベースのプロパティ->ファイルで「初期サイズ」を変更した場合に過ぎませんか?これを実行するには、データベースをオフラインにする必要があると思いますか? 前もって感謝します

3
変更データキャプチャ-誰が変更を行ったかを知る方法は?
CDCが特定した変更を誰が行ったかを追跡します。 私の日時ハックの行に沿って、cdc変更追跡テーブルのデフォルト値を持つ新しいフィールドとしてsuser_snameを追加することにより、同じアプローチを試しました。しかし、これは、cdcプロセスの所有者を返すようであり、ベーステーブルで変更を開始したユーザーを返しません。私もoriginal_loginを試しましたが、sqlサービスアカウントのログインが返されます。繰り返しますが、おそらく変更を開始したユーザーではなく、cdcプロセスに関連付けられています。 私はスタックオーバーフローで同様の質問を見つけましたが、フロントエンドからの変更を追跡するか、トリガーを介する以外に回答はありませんでした。これは、cdcを使用する目的に反するようです。私は再投稿しませんが、元のものがスタックオーバーフローにあったので、特にR2または2012がより良い方法を導入している場合は、ここで試してみようと思いました。 つまり、要するに、変更データキャプチャで誰が変更を行ったかを知るにはどうすればよいのでしょうか。

3
MASTERデータベースを復元してTDE証明書を回復できますか?
(幸いなことに、私たちは現在このような状況にありません。それが発生した場合の選択肢がどうなるかを事前に計画しているだけです。) 透過的日付暗号化(TDE)で暗号化されたデータベースの場合、暗号化に使用した証明書のバックアップがない限り、データベースバックアップのコピーは回復できません。 それがない場合はどうなりますか?追加のオプションはありますか? 完全なサーバー障害が発生した場合、MASTERデータベースのバックアップを新しいハードウェアに復元すると、証明書も復元されますか?

1
insert-execブロックを使用して呼び出されたストアドプロシージャでの例外の処理
insert-execブロックで呼び出されるストアドプロシージャがあります。 insert into @t exec('test') ストアドプロシージャで生成された例外を処理し、処理を続行するにはどうすればよいですか? 次のコードは問題を示しています。私がやりたいことは、内部exec()呼び出しの成功または失敗に応じて0または-1を返すことです。 alter procedure test -- or create as begin try declare @retval int; -- This code assumes that PrintMax exists already so this generates an error exec('create procedure PrintMax as begin print ''hello world'' end;') set @retval = 0; select @retval; return(@retval); end try …

3
テーブルに数式を保存し、関数でその数式を使用する
PostgreSQL 9.1データベースがあり、その一部がエージェントの手数料を処理しています。各エージェントには、彼らが得る手数料の計算式があります。エージェントごとのコミッションを生成する機能を持っていますが、エージェント数が増えると使えなくなります。非常に長いケースステートメントと繰り返しコードを実行することを余儀なくされたため、私の機能が非常に大きくなりました。 すべての数式には定数変数があります: d ..その月に働いた日数 r ..獲得した新しいノード l ..ロイヤルティスコア s ..サブエージェント手数料 b ..基本レート i ..獲得した収益 式は次のようになります。 d*b+(l*4+r)+(i/d)+s 各エージェントは、HR部門と支払い式を交渉します。では、式をエージェントテーブルに保存して、テーブルから式を取得して値で変換し、金額を計算するだけの小さな関数のようにできますか?

2
インデックスをフィルターされた(非null値)インデックスに置き換えるとどのような影響がありますか?
私たちのプロジェクトは、非常に大規模で非常に複雑なデータベースを実行しています。そのため、約1か月前に、null値を含むインデックス付き列で使用される領域が大きくなりすぎていることに気付きました。これに対する応答として、1%を超えるnull値を含むすべての単一列インデックスを動的に検索し、値がNOT NULLであるという条件でフィルター処理されたインデックスとしてそれらのインデックスを削除して再作成するスクリプトとして書きました。これにより、データベース全体で数百のインデックスが削除および再作成され、通常、DB全体で使用されるスペースのほぼ15%が解放されます。 今私はこれについて2つの質問があります: A)この方法でフィルター処理されたインデックスを使用することの欠点は何ですか?パフォーマンスが向上するだけだと思いますが、パフォーマンス上のリスクはありますか? B)インデックスを削除して再作成すると、「インデックスXYZは削除できないため、削除できません」というエラーが発生しました。後でチェックすると、すべてが期待どおりに実行されました。これはどうして起こりますか? 助けてくれてありがとう! 編集: @Thomas Kejserへの返信 こんにちは、ありがとうございます。しかし、これは災害でした。当時、私たちは次のようないくつかのことを理解していませんでした: SQLOSはクエリ中に、テーブル列の結合にNULL値を使用できないと判断する前に、インデックスプランを作成します。つまり、クエリで使用されるすべてのフィルター処理されたインデックスのインデックスをフィッティングするWHERE句フィルターが本当に必要です。そうしないと、インデックスはまったく使用されません。 インデックスを削除して作成し、その後統計を冗長に更新するだけでは、更新された計画を作成するには不十分である可能性があります。場合によっては、SQL Serverが計画の再評価を余儀なくされるほど高いワークロードのみが表示されることがあります。 常識とロジックだけで判断するのが難しい実行プランナーの機能には、いくつかの珍しいものがあります。数千のコードビハインドで生成されたさまざまなクエリのバリエーションでさえ、一見役に立たないように見えるインデックスは、重要なクエリで使用される統計やクエリプランに役立ちます。 最終的に、これらの変更は元に戻されました。したがって、フィルター選択されたインデックスは強力なツールですが、これらの列からフェッチされるデータを正確に理解する必要があります。スペースの問題は別として、通常のインデックスは適用がかなり簡単ですが、フィルター選択されたインデックスは非常にカスタマイズされたソリューションを表します。これらは通常のインデックスの代わりではなく、必要な特別な状況での拡張です。


1
Cassandraの列ファミリーの実際的な制限は何ですか?
Cassandraでは、数千を超える列ファミリーを持つことはお勧めしません。議論のために2,000としましょう。2,000を超えるタイプのデータを保持する必要がある場合、1つのアプローチは、複数の無関係なタイプのデータを各列ファミリーに分割することです。 たとえば、1つのCFにOrders、Invoices、およびCustomersを含めることができます。ただし、行キーが異なる場合(たとえば、オブジェクトタイプの接頭辞、つまり、1つのCFのキーにOrder|1234との両方を含めることができますCustomer|1234)。2番目のCFには、たとえば、Addresses、LineItems、およびOrde​​rTypeを含めることができます。このアプローチの基本的な実現可能性を考えると、それに対する実際的な制限は何ですか?たとえば、10,000種類すべてのオブジェクトを1つのCFに配置することの何が問題になっていますか?Cassandra wikiからわかる限り、CFのサイズに厳密な制限はありません。

4
文書化されていない大規模なデータベースに取り組む方法
私は最近、特定のX社の唯一のITガイとして雇われ、彼らのアプリケーションを修正する必要があります。私の意見では、データベースを理解することから始めるのが最善の方法です。 彼らの現在のデータベースは186のテーブルを持つMySQLデータベースです(いくつかのテーブルは神が理由を知っているので空であることに注意してください)。また、アプリケーションはMS Accessデータベースインターフェイスを介してデータベースと通信しています。(私はなぜ開発者もそれをしたのか自問します) 質問は、この文書化されていない大規模なデータベースへの取り組みをどのように開始するかです。はい、それは文書化されていません。アプリケーションの開発者は、私の生活を簡単にするために、ERDやデータディクショナリ、またはデータベースに関する情報を提供するつもりがないからです。かなり大規模なデータベースの隅々を理解するというこの危険な努力にどう取り組むべきでしょうか。 関連質問:醜いデータベースに飛び込む方法は?

4
mysqldumpを使用して500GBデータベースの高速バックアップと復元を増やす方法は?
500GBのデータベースAサイズがあります。データベースAのテーブルには、MyISAMテーブルとINNODBテーブルの両方が含まれています。MyISAMテーブルはマスターテーブルで、Innodbテーブルはメイントランザクションテーブルです。 mysqlダンプを使用してバックアップと復元を行うと、長時間または数日で終了します。 max_allowed_pa​​cket = 1G foreign_key_checks = 0 auto_commit =オフ

3
別のジョブ内でSQL Serverジョブを呼び出す
SQL Serverジョブを呼び出して別のジョブ内で実行することは可能ですか? ジョブ1のすべてのステップをジョブ2に追加できることはわかっていますが、そうしたくないのです。1つはジョブ2がすでに非常に大きく、2つ目はジョブ間でステップをコピーするためのコピー/貼り付けオプションが見つからなかったため、手動でステップを追加するのに時間がかかります。 任意の提案をいただければ幸いです。

4
シングルユーザーモードでSQLサーバーに接続できない
私は私の始めているSQL Server 2008 sqlcst02\inst01中をSingle User Mode付加することで;-m、このインスタンスの起動パラメータの終わりにSQL Server Configuration Manager。インスタンスのSQL Server Agentために停止しましたinst01。私のアカウントはのメンバーであり、サービスDomain Admin groupを使用してログインしようとするsqlcmd -S sqlcst02\inst01とエラーが発生し続け、ログインSingle User Modeできる管理者は1人だけです。;-m"sqlcmd"接続を制限するために起動パラメーターに追加しようとしましたsqlcmdが、同じ結果。私は自分のアカウントでログインし、ローカル管理者アカウントでログインしてみました。自分と管理者の両方でコマンドプロンプトを起動しましたが、同じ結果が得られます。で接続してみADMIN:sqlcst02\inst01ましたSSMS。運が悪い。 sa前の管理者がこの情報を教えてくれなかったため、パスワードをリセットしようとしています。これは厄介です。私は以前に他のマシンでこれを問題なく行いました。

1
クエリの最適化:時間間隔
主に、2種類の時間間隔があります。 presence time そして absence time absence time さまざまなタイプ(休憩、欠席、特別な日など)にすることができ、時間間隔が重複したり交差したりする場合があります。 生データに存在する区間のもっともらしい組み合わせだけが存在するかどうかは確かではありません。存在間隔の重複は意味がありませんが、存在する場合があります。結果として得られるプレゼンスタイムインターバルをさまざまな方法で特定しようとしましたが、私にとって、最も快適なのは次のインターバルのようです。 ;with "timestamps" as ( select "id" = row_number() over ( order by "empId", "timestamp", "opening", "type" ) , "empId" , "timestamp" , "type" , "opening" from ( select "empId", "timestamp", "type", case when "types" = 'starttime' then 1 else -1 …

1
SQL Server 2000から2008から2012
現在、SQL Server 2000から2008に移行しています。2000年から2008年にかけて多くの変更が加えられたため、コードやスクリプトに多くの変更を加えています。これらの変更を行いながら、知りたいのは-2012年にも互換性を持たせるために今できることはありますか?同時に。2012年から2008年などの下位互換性のある変更が少なくともあります。これを行いたいのは、2008年から2012年に移行することを決定したときに、将来(3〜4年後)の労力を最小限に抑えるためです。私ができること、または知っておくべきことは何ですか?

3
分散スイッチを使用してVMWareゲストからSQL Serverに一括挿入
これはほとんどSQLサーバーの問題ではない可能性がありますが、セットアップはSQLサーバーへの一括挿入にのみ影響しているようです。 最近、VMハードウェアを移動しました。移動したすべてのゲストの仮想スイッチが標準から分散に変更されました。 それから私は受け取り始めました ネットワークからの入力ストリームの読み取り中に致命的なエラーが発生しました。セッションは終了します(入力エラー:64、出力エラー:0) BULK INSERT操作中の2つのSQLサーバー。SQLサーバーの1つは新しい構成のVMで、もう1つは物理サーバーです。両方のBULK INSERT操作は、新しい構成のVMから発生しました。BULK INSERTは毎回失敗するわけではなく、失敗するときは非常にランダムでした。 仮想スイッチを分散スイッチではなく標準スイッチに変更すると、問題はなくなります。 解決策の代わりに分散スイッチで動作しない理由の詳細を探しています。私の推測では、BULK INSERT操作はシリアルであり、分散スイッチでは、パケットは異なるホストを介してルーティングされており、その一部は他のホストよりビジーであり、遅延しきい値を超えて宛先サーバーに到達しています。(注:ソースまたは宛先サーバーのいずれかでエラーが発生したとき、Windowsイベントログには何もありません) 更新:問題はNICが原因であることが判明しました。すべてのVMは、標準スイッチで十分に機能するE1000 NICで構成されました。分散スイッチに移行すると、SQLクエリだけでなく、大量のデータ転送に関する問題が発生し始めました。NICをVMXNET3に変更すると、問題が解決したようです。

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