データベース管理者

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

4
最小値を持つすべての行を選択します
Sqlite 3では、最小値に基づいて行を選択する方法を理解しようとしています。Googleを効果的に検索するのに十分な関連用語がわからないため、制限があると思います。 テーブルは次のようになります。 num text num2 ---------- ---------- ---------- 0 a 1 0 a 2 1 a 3 1 b 4 私は、行を取得したいnum2ですが1, 2、と4。テキスト列の一意の値ごとに、numの最小値に基づいて選択を行います。 だから、のためtext = 'a'の最小値、numである0私は、行1および2.たいのでtext = 'b'、の最小値numであるが1、私は行をしたいので4。 することにより、グループの様々な組み合わせを使用して、私はどちらかの行を取得することができるよ1と2または行を1して4。自分のやりたいことを実行するSQLコンポーネントが不足しているように感じますが、それが何であるかを理解することができませんでした。 このタイプのクエリを実行する適切な方法は何ですか? 可能な解決策 これを行う方法を見つけました。自分の質問に答えるほど評判がよくないので、ここで更新を行っています。それが常に正しいのか、それとも効率がどの程度なのかはわかりません。コメントは大歓迎です。 1つのクエリでテキストの一意の値ごとにnumの最小値を見つける、複合selectステートメントを使用しました。 sqlite> select num, text from t group by text having num = min( num ); num text …
9 sqlite 

1
バックアップ情報(成功および失敗)SQL Serverを表示するクエリ
2つの異なるデータベースをバックアップする2つのジョブがあります。 ジョブ1がDB1 をバックアップする ジョブ2がDB2 をバックアップするドライブ1の空き容量が少なくなり、ジョブ1が失敗するため、DB1はバックアップに失敗します。この問題を修正するには、スペースを追加する必要がありました。大したことはありません。この問題が1か月にわたって発生しているときに、今日、このことについて知らされました。うん、それはクレイジーだと知っているが、それは開発者だ DB1の完全なバックアップ履歴を取得したい。msdb.dbo.backupsetテーブルから正常なバックアップ情報を取得できることはわかっていますが、データベースの失敗したバックアップを表示するクエリがあるかどうかを知りたいです。 以下のクエリは、12/31 / 13-1 / 27/14の特定のデータベースのバックアップ履歴を表示します。情報には、サーバー、データベース名、バックアップの開始時間と終了時間、dbsのバックアップにかかった合計時間、dbサイズ、バックアップセット名が含まれます。 SELECT distinct CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date, CAST((DATEDIFF(second, msdb.dbo.backupset.backup_start_date,msdb.dbo.backupset.backup_finish_date)) AS varchar)+ ' secs ' AS [Total Time] , Cast(msdb.dbo.backupset.backup_size/1024/1024 AS numeric(10,2)) AS 'Backup Size(MB)', msdb.dbo.backupset.name AS backupset_name FROM msdb.dbo.backupmediafamily INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id --Enter …

2
DBの再起動後にエラー15404をクリアする方法(再起動以外)
SQL Serverエージェントの1時間ごとのジョブが頻繁に(たとえば、数か月ごと)エラー15404の報告を開始し、介入されるまで報告を続けます。 [298] SQLServerエラー:15404、Windows NTグループ/ユーザー 'DOMAIN_NAME \ SomeDomainAccount'に関する情報を取得できませんでした、エラーコード0x6e。[SQLSTATE 42000](ConnIsLoginSysAdmin) SQL ServerエンジンおよびSQL Serverエージェントサービスを手動で再起動した直後に、最初の障害が発生することがあります。マシンを再起動すると、問題を解決できます。 ジョブの所有者は、エラーメッセージに表示される名前で、SQL Server管理者です。 SQL Serverエンジンサービスアカウントは、サービスアカウントのように見えます(私はそれがデフォルトのインストールアカウントであると思います(エンジン/エージェントインスタンス間の干渉を防ぐために、一般的なNetworkServiceよりも1ノッチ優れています)。 NT Service\MSSQL$INSTNAME ジョブが常に失敗する場合は1つのことですが、再起動後にジョブが成功するため、などのサービスアカウントが機能しているはずであり、A / Dタイミングの問題やバグがあると思います。A / D構成についてITに質問すると、通常は「何も変更されていません」という応答になります。 エンジンおよびエージェントサービスを再起動すると、ジョブが失敗し始める可能性があります。 マシンを再起動すると問題が解決します。 エンジンとエージェントをすぐに再起動しても、ジョブが失敗することはなくなりました。 リンク: SQL Server 8198エラーのトラブルシューティング方法


1
表示するデータがないときにTablixの構造を維持する方法
Tablixのデータセットの結果を示すSSRSレポートがあります。データセット内のクエリがデータを返さない場合、Tablixのヘッダーは表示されますが、ヘッダーの下のTablixセルは表示されません。にプロパティがあることは知っていますNoRowMessageが、実際には私たちが望むものではありません。メッセージを指定すると、SSRSは空のtablixではなくメッセージを表示します.tablix構造をそのまま表示する必要がありますが、空のセルが必要です。 IsNothing関数を使用してtablixの各セル値にルールを設定し、値がnullの場合に空白( "")を表示するように設定しましたが、役に立ちませんでした。 何か考えはありますか?よろしくお願いします。

3
別のテーブルのデータでテーブルを上書きする-SQL
ユーザーは本番環境からQAデータベースを更新したいが、2つのテーブル(T1とT2と呼ぶ)が元のQAデータを保持することを望んでいます。そのため、2つのテーブルをQA(DB1)から一時QAデータベース(DB2)にコピーしました。次に、DB1を本番環境から更新しました。更新後、T1およびT2データをDB2からDB1に上書きして、更新前のQA値を含めることができるようにします。 私は次のことを行いました: 使用する select * INTO D1.dbo.T1 FROM D2.dbo.T1 次に、製品からD1を更新しました 次に、次の手順でT1を切り捨てます。 SELECT COUNT(*) AS BeforeTruncateCount FROM T1; GO TRUNCATE TABLE T1; GO SELECT COUNT(*) AS AfterTruncateCount FROM T1; GO D2.T1からD1.T1にデータをコピーするために戻ると、データベースにT1という名前のオブジェクトが既に存在するというエラーが表示されます。 テーブルをドロップしてコピーする必要がありますか? または、手順全体に適した方法はありますか?

2
postgresqlデータベースが存在するかどうかを確認します(大文字と小文字を区別しない方法)
dbが存在するかどうかをチェックする「エレガントな組み込み」の大文字と小文字を区別しない方法はありますか? しか見つかりませんでしたSELECT datname FROM pg_catalog.pg_database WHERE datname='dbname'が、これはCSチェックです。すべてのデータベース名を取得して手動でフィルタリングすることを最初に思い浮かぶのは、よりエレガントな方法があると思います。

4
データベースがオンラインのときにデータベースのファイルをコピーできますか?
SQL Server 2008 R2 SP1で運用データベースの開発用コピーをセットアップする作業をしています。ライブデータベースは、現在2人の開発者が読み取り専用クエリで軽く使用していますが、新しいデータベースでも更新が行われます。 データベースは2.1TBで、テストに必要な最新のビルドに復元して更新するのに合計3日かかったので、私の元々の計画は、新しいバックアップファイルセットを作成し、それらのファイルから復元することでした。これにより、現在のデータベースをオフラインにすることなく、同じSQLインスタンスとマシン上にデータベースの開発コピーを作成できます。 ただし、この2、3日を節約するために、物理データベースファイルをコピーして、データベースの新しいコピーを添付することをお勧めします。残念ながら、コピーしようとすると、SQL Serverがそれらのファイルにかけるロックを参照するエラーが発生します。 データベースをオフラインにすることはできませんが、ログファイルを転送するだけです(朝に入る前にこれを完了できます)。データベースをオフライン状態にせずにライブデータベースファイルをコピーする方法はありますか?それとも、家に帰るまで待つべきでしょうか?

2
TOASTテーブルの成長が制御不能-FULLVACは何もしません
最近、自動バキューム機能を利用して他の30個のPGSQLサーバーと連携するために、PostgreSQL 8.2.11サーバーを8.4にアップグレードしました。これは、ハードウェアを管理する別のITグループによって行われたため、他のアップグレードを選択する余地はほとんどありません(しばらくの間、9以上は表示されません)。サーバーは非常に閉じた環境(孤立したネットワーク、限られたroot権限)に存在し、RHEL5.5(i686)で実行されます。アップグレード後、データベースは常に1日あたり5〜6 GBに成長しています。通常、データベース全体では、約20GBです。現在、それは〜89GBです。同等のデータベースを実行し、実際にサードパーティのアプリケーションを介してレコードを相互に同期するサーバーがいくつかあります(1つは内部の仕組みにアクセスできません)。他のデータベースは、本来あるべきように〜20GBです。 次のSQLを実行すると、特定のテーブル、具体的にはそのTOASTテーブルに問題があることはかなり明白です。 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_relation_size(C.oid) DESC LIMIT 20; 生成されるもの: 関係| サイズ ------------------------------------ + --------- pg_toast.pg_toast_16874 | 89 GB 数00.warmstates | …

3
非クラスター化インデックスはクラスター化インデックスよりも高速ですか?
両方のテーブルは同じ構造で、各テーブルに19972行あります。インデックス作成を練習するために、同じ構造の両方のテーブルを作成して作成しました clustered index on persontb(BusinessEntityID) そして nonclustered index on Persontb_NC(BusinessEntityId) およびテーブル構造 BusinessEntityID int FirstName varchar(100) LastName varchar(100) -- Nonclusted key on businessentityid takes 38% SELECT BusinessEntityId from Persontb_NC WHERE businessentityid BETWEEN 400 AND 4000 -- CLustered key businessentityid takes 62% SELECT BusinessEntityId from persontb WHERE businessentityid BETWEEN 400 AND 4000 …

1
`pg_lsclusters`がPostgresクラスタをリストしないのはなぜですか?
apt-getPostgres 9.2.4 をインストールしました(PPAを使用)。 私が使用pg_dropcluster --stop 9.2 main私はちょうど取り付けられた別個のSSDボリューム(ラックスペースブロック・ストレージ・ボリューム)に新しいクラスタを作成する方法を意図するので、デフォルトデータベースクラスタを除去します。 SSDボリュームにデータが存在する新しいクラスターを作成して開始しました(psその新しいクラスターで実行されているすべての通常のPostgresプロセスが表示され、Postgresシェルを開いてSQLを実行できます(つまり、正常に実行されています)。実行pg_lsclustersすると、何も表示されません。 main私はそれを削除する前に、クラスタがうまく上場しました。新しいクラスターが実行されているのに、なぜ表示されないのですか?サーバーを再起動しました(念のため)。

1
Amazon RDSのデータベース接続が多すぎる
Drupalでクエリ/ビューを実行しているユーザーに問題があり、サイトがフリーズすることがあります。フリーズが発生するのは、クエリによってデータベース接続の数が最大400以上になり、基本的にサイトが100を超えるデータベース接続を行うと、サイトの速度が大幅に低下し、応答しなくなるためです。 MySQL Red Hat Linuxを使用してAmazon RDSを実行しています フロントエンドアプリサーバーには十分な大きさのEC2があり、十分な大きさのRDSがあります。 この問題を修正する方法は、問題のあるクエリを見つけて強制終了することです。クエリが強制終了されると、データベース接続は約20に低下します。これは、サイト統計を監視するときに表示される通常の量です。 問題のあるクエリを停止し、実行時間が長すぎて接続を消費する前にそれを強制終了する方法はありますか?不正なクエリが発生する前に強制終了することを自動化するか、少なくとも30秒後に不正なクエリを認識して強制終了します。

3
スキーマ内のすべてのテーブルに対するすべての権限をIBM DB2のユーザーに付与する方法は?
まず、データベースをIBM DB2 AIXからIBM DB2ウィンドウにエクスポートします。残念ながら、OSの問題により、BACKUPとRESTOREコマンドを使用できません。そのため、db2moveコマンドを使用する必要があります。 私は、エクスポートされたMYSCHEMAのからスキーマとテーブルのすべてをdbempのこのコマンドを使用してリモートIBM DB2 AIXでのデータベース: db2move dbemp export -sn myschema このコマンドを実行すると、dbuser1という名前のユーザーとしてログインしました。 現在のフォルダーにたくさんのファイルを生成します。IBM DB2 LUWがインストールされているローカルマシン(Windows)にファイルを取得します。 次に、ローカルマシンのIBM DB2で、IBM Data Studioを使用して、最初に既存のスキーマmyschemaを削除しました(ローカルdbempデータベースもありました)。 次に、次のコマンドを使用してファイルをインポートしました。 db2move dbemp import スキーマとテーブルをローカルのdbempデータベースに正常にインポートします。 上記のアクションを実行したとき、ユーザーwinuser1としてログインしていました。 ローカルマシン(Windows)にもdbuser1という名前のローカルユーザーがいます。IBM Data Studioで、dbuser1ユーザーを使用してローカルdbempに接続する接続プロファイルを作成しました。myschemaスキーマとテーブルを参照できますが、テーブルのデータを参照できません(特権エラーが発生しました)。ユーザーwinuser1はテーブルのデータを参照できますが、開発のために、ユーザーdbuser1を使用してデータベースに接続する必要があります。 そのため、次のようにテーブルのユーザーに特権を付与できることがわかりました。 GRANT ALL ON myschema.table1 TO USER dbuser1 問題は、100個のテーブルがあることです。テーブルごとにその行を入力したくありません。残念ながら、次のようなワイルドカードソリューションはありません。 GRANT ALL ON myschema.* TO USER dbuser1 -- this doesn't work したがって、問題は、スキーマ内のすべてのテーブルに対するすべての特権をユーザーにどのように付与するかということです。または、より良い代替ソリューションはありますか?多分からすべての権限をコピーしてwinuser1にdbuser1?

3
ロックが使用するメモリ
ちょっと不思議ですが、データベースのRAMサイズが128 GBのSQL 2012 Enterpriseエディションの1つは370 GBであり、ロック(OBJECTSTORE_LOCK_Manager)のメモリクラークが使用するメモリの量は7466016 KBを示します。パフォーマンスカウンターを見ても確認できますselect * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)' ただし、クエリを実行すると select count(*) from sys.dm_tran_locks 16個のロックのみが表示されます。つまり、7 GBを超えるロックを使用しているものです。調べる方法はありますか? いったんロック用のメモリが割り当てられたら、SQLはまだそれを割り当て解除していないのですか?過去1時間で、ロックカウントが500を超えていないようですが、ロックメモリは同じままです。 最大サーバーメモリは106 GBです。メモリ内でロックページを使用していないため、過去12時間のメモリログにエラーが発生したり、メモリ不足が発生したりすることはありません。Available MBytesカウンタは、15 GBを超える使用可能なメモリを示しています。 アクティビティモニターは常に待機中のタスクを0と表示するため、明らかにブロックされません。 SQLサーバーのロックには約100バイトのメモリが必要であることを考慮すると、7 GBは大量のメモリであり、誰がそれを使用しているかを調べようとします。 ロックカウントでサーバーダッシュボードレポートのトップトランザクションを実行すると、「現在、システム上でロックトランザクションは実行されていません。ただし、ロックメモリは上記のように表示されます。DBは夜間に最もビジーです。

2
権限のないユーザーが利用できるリンクサーバー
リンクされているサーバーが表示されるはずのないユーザーがいます。 リンクサーバーは、私だけがアクセスできるように定義されていますが、誰でも見ることができます。 次の手順で新しいリンクサーバーを作成しました。 SSMSオブジェクトエクスプローラーをSQL Serverインスタンスに接続する 展開Server Objects、右クリックLinked Servers、左クリックNew Linked Server... Generalタブの下でサーバー名を選択SQL ServerしServer typeて書き込みます Security上部のタブの下でをクリックしAdd、「sa」を選択しLocal Login、Remote User名前を入力してRemote Password 下ではSecurity、タブ下部(下にFor a login not defined in the list above, connections will:)最初のオプションを選択します。Not be made クリックしOKてテストを開始 これで、リンクサーバーを見ることができるのは私( "sa")だけですが、どういうわけか他のユーザーはそれを見て使用できます。 注1:リンクサーバーを使用できるユーザーには、リモートサーバーに対するアクセス許可があり、表示すべきでないデータは表示されません。リンクサーバーからアクセスできないはずのデータにアクセスできます。 注2:sysadminどちらの場合も私だけです。

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