データベース管理者

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



2
SQL-SERVER 2008リンクサーバー経由でOracleのCLOB列を読み取れないのはなぜですか?
SQL-Server 2008からOracle 11gデータベースのデータにアクセスしたい リンクサーバーを設定し、実行時に select * from [Link_server_name]..Oracle_schema.Oracle_table Oracle_tableにはNumber列とvarchar2列が含まれ、すべて例外として機能します。 しかし、Oracle_tableにCLOB列が含まれていると、次のエラーが発生します。 Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Unspecified error'zurückgeben。 Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Oracleエラーが発生しましたが、エラーメッセージをOracleから取得できませんでした。zurückgeben。 Der OLE DB-Anbieter 'MSDAORA'fürden Verbindungsserver 'L_V407SR8T' hat die Meldung 'Data type is not supported。' zurückgeben。 メッセージ7306、レベル16、状態2、行1 ダイ「 "MCCAPP"。 "DOGGRUPPEN"」-Tabelle …

2
SQL 2005:インデックスの再構築ジョブがデータベースログファイルをどれだけ拡張できるかを判断できますか?
SQL Server 2005で、すべてのデータベースがフルモード(1時間ごとのトランザクションログバックアップを使用)である場合、データベースのすべてのインデックスを再構築してデータベースのログファイルを拡張できるかどうかを判断できますか?そして、それはどれくらい成長することができますか? 正解がない場合は、どのような指示もいただければ幸いです。 前もって感謝します。

9
ロードバランサーなしの負荷分散MySQLクラスター
私は、負荷分散されたMySQLクラスターを作成しようとしていますが、実際の負荷分散装置を使用せずに、障害や複雑さの別のポイントを追加しません。 私が考えていたのは、次のことです。 MySQLのマスターマスターセットアップがある すべてのクライアントに、サーバー間で要求をローテーションする単純なラウンドロビンプロキシを配置します。 これは可能ですか?またはこれを達成するためのより良い方法はありますか?
10 mysql 

10
データベースを初期サイズ以下に縮小する
ライブの30GBコピーであるSQL Server 2005開発データベースを持っています。devで不要なデータをいくつか削除しました。これにより、使用されるデータファイルスペースが20GBに下がります。したがって、約33%が未使用です。 スペースを再利用する必要があります。これにより、サーバーに2番目の開発DBを(カットダウンバージョンに基づいて)配置できます。ただし、スペースを取り戻すことはできません。次のようにしました。 ファイルの初期サイズSMS2_Dataは30GBです。 DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY) に続く DBCC SHRINKFILE (N'SMS2_Data' , 19500) 喜びがない。バックアップを作成して、初期サイズの小さい新しいDBを作成してから復元しようとしましたが、初期サイズが上書きされて喜びません。また試しました: ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) これは誤り、言った: MODIFY FILEが失敗しました。指定されたサイズは現在のサイズよりも小さいです。 20800を試してから29000(29GB)まで上がり続けましたが、それでも変更できません。 縮小を行った後、回復モードをからFULLに変更しSIMPLEました。喜びがない。 いくつかのTEXT分野と関係があると思いました。システム全体で約6つあります。テストとして、すべてを削除してからファイルを縮小しましたが、変更はありませんでした。 残っている唯一のオプションは、データを別のDBに再インポートすることです。ライブDBで実行する必要があるため、これは実用的ではなく、リスクが高すぎます。半定期的にライブDBのコピーを取得し、dev / testを上書きします。500テーブルのようなものがあります。新しいDBにデータをエクスポートするリスクのない方法を教えてください。 データを別のファイルに移動しようとすると、データの5%を除くすべてがコピーされました。これが、すべてのテキスト列を削除しようとした理由です。 サーバーは互換モード90ですが、SP2です。これで、すべてのテーブルのインデックスの再作成、データベースのバックアップ、ファイルの圧縮、データベースの圧縮の3回を実行しました。まだ喜びはありません。 EXECUTE sp_spaceused 戻り値: database_name database_size unallocated space SMS2Tests 31453.94 MB …

2
saユーザーをロックアウトしました
そこで、Microsoft SQL Server Management Studio 2019の一部の設定を変更しようとしました。ログインモードを混合(WindowsとSQL認証)からWindowsのみに変更したところ、saアカウントでログインできなくなりました。管理者権限を持つ別のアカウントを持っています。 私は何をすべきか?どんな提案も高く評価されます。


5
なぜユーザーのパスワードを保存するのですか?
Webアプリケーションのユーザーパスワードを安全に保存する方法を尋ねる質問がときどきあります(RDBMSを使用して、私はFacebookやTwitterについて話していません)。通常の答えは、「パスワードをソルト化してから、TDESやSHA512などの強力なアルゴリズムでハッシュする」です。 私の質問は次のとおりです。RDBMSユーザーとして、ほとんどのエンジンには認証メカニズムが組み込まれているため、パスワードの保存にまったく問題がないのはなぜですか。 たとえば、一部のユーザーXが自分のWebアプリケーションでアカウントユーザーパスワードYを作成したい場合、次のクエリを間違って発行するとどうなりますか。 CREATE USER X WITH ENCRYPTED PASSWORD Y IN GROUP baseuser; 次に、私のアプリケーション内で、ユーザーは自分の資格情報を使用してデータベースへの接続を開くことができ、パスワード管理のすべてに煩わされる必要はありません。 この方法にはいくつかの利点があります。 暗号化アルゴリズムを変更する必要があるとRDBMSが判断した場合、セキュリティ更新を適用するだけで、何もする必要はありません。 ユーザーの承認を管理するのは簡単です。ユーザーが管理者の役割に昇格された場合、ユーザーを対応するグループに追加するだけです。 SQLインジェクションは無意味になりました。データベース内の各ユーザーに許可したいものを正確に許可する権限を管理しているためです(たとえば、SOのようなフォーラムで、新しい投稿の追加、投稿への回答、コメントおよび自分の質問の編集/削除)。 / answers / comments); ユーザーアカウント "匿名"は、アプリケーションへの認証されていない接続に使用できます。 各ユーザーは、提供したデータの所有者です。 しかし、このトピックに関して私が見るほぼすべての質問について、これは物事を実行する方法ではないという一般的なコンセンサスがあるようです。私の質問は:なぜですか? 注:三点目は、によって許可されたポリシー PostgreSQLで、かつセキュリティポリシーのMicrosoft SQL Serverのインチ これらの概念は新しいものであることがわかりましたが、とにかく、ここにあるので、ここで説明する手法がユーザーアカウントを処理する標準的な方法にならないのはなぜですか。
10 security  users 

1
「データの移動が原因でNOLOCKでスキャンを続行できませんでした」を再現する方法
NOLOCK一部の大規模なジョブで、「データの移動が原因でスキャンを続行できませんでした」というメッセージが時々表示さWITH (NOLOCK)れます。これは、選択クエリで実行されます。 これは、ページ分割があり、データが本来あるべき場所でなくなったときにデータを選択しようとすることと関係があることを理解しています。それが私の環境で起こっていることだと思います。 これをどのように再現しますか? 短期的な回避策を講じてエラーをキャッチし、これが発生したときに再試行しようとしていますが、再現できない場合はテストできません。これを引き起こす合理的に信頼できる方法はありますか? それが発生した場合、クエリを再度実行すると成功します。そのため、実際のデータやデータベースが永続的に破損する心配はありません。クエリ内の一部のテーブル(およびそのインデックス)は、頻繁に削除、再作成、および再設定されるため、これに関連していると想定しています。 削除NOLOCKは、私が対処する長期的な問題です。NOLOCKそもそもそこに置かれた理由は、クエリが非常に悪いため、日常のトランザクションでデッドロックが発生しNOLOCK、デッドロックを阻止するためのバンドエイドが機能したためです(機能しました)。ですから、永久的な解決策ができるまで、私はバンドエイドの上にバンドエイドを必要としています。 Hello Worldでそれを再現できれば、おそらく1時間もかからずにバンドエイドを仕事に投入する予定です。検索と置換の削除を実行できませんNOLOCK。これは、アプリのデッドロックが再び発生し始めるためです。 コミットされた読み取りスナップショット分離を使用することは良い可能性です。詳細については、データベースチームと協力する必要があります。私たちの問題の一部は、そのようなことを処理するSQL Serverの専門家がいないことです。また、現時点でその変更を行うのに十分な分離レベルを理解していません。

5
テーブルの行サイズと最大行サイズを計算する
問題: テーブルの作成に使用されるバイト数を計算する方法はありますか?information_schema.tablesからいくつかの情報を取得できますが、その情報は十分に正確ではありません。 実際に必要なのは、innodbのみのテーブルの定義によるバイト数であり、照合はutf-8-general-ciと見なすこともできます。 たとえば、テーブルテストは次のようになります。 テーブルテストの作成 ( col1 varchar(25)、 col2 int、 col3 varchar(3)、 col4 char(15)、 col5 datetime )); これで、テーブルの列のタイプに応じて1つの行に累積できる合計行サイズを知る必要があります。 MSSQLで同様のソリューションを見つけたが、MySQLバージョンが必要 任意のテーブルの行サイズを推定するスクリプト どんな助けでも大歓迎です。

2
測定単位を変換する
物質が異なる(ただし互換性のある)単位体積で与えられている物質のリストに最も適した測定単位を計算しようとしています。 単位換算表 単位変換テーブルには、さまざまな単位とそれらの単位の関係が格納されています。 id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 係数でソートすると、parent_id子ユニットが上位の数値にリンクされていることがわかります。 このテーブルは、PostgreSQLで以下を使用して作成できます。 CREATE TABLE unit_conversion ( id …

3
SQL BULK挿入/ BCPエクスポート後に使用済みメモリが解放されない
次のように非常に基本的なSQLテーブルを作成しました CREATE TABLE [dbo].[TickData]( [Date] [varchar](12) NULL, [Time] [varchar](12) NOT NULL, [Symbol] [varchar](12) NOT NULL, [Side] [varchar](2) NOT NULL, [Depth] [varchar](2) NOT NULL, [Quote] [varchar](12) NOT NULL, [Size] [varchar](18) NOT NULL ) ON [PRIMARY] 次に、3ギガの一括挿入を実行しました BULK INSERT TickData FROM 'C:\SUMO.csv' GO 次に、SQLサーバーのRAM使用量はSkyrockingになり、最大30GoのRAMを消費しました。 これは異常な動作であると考えるのが好きで、これを回避するためにそのアクションを実行できます。 編集: OK、これはデフォルトの動作のようです。けっこうだ。 しかし、なぜ一括挿入が完了した後もメモリが解放されないのですか? いくつかの特別な考慮事項: SQLサーバーがOSから「伝えられた」ときにメモリを解放することに関するコメントのように、24コア32 Gb Xeonサーバーでの実地経験では、これが不正確であることが証明されています。抽出されたデータを処理する必要があるデータ処理アプリケーションの.Netインスタンスのプールがあり、残りのメモリを共有してジョブを実行しようとするため、窒息状態のままになっています。SQLServerがオンになったときよりも時間がかかります。オフにすると、すべてのアプリケーションでメモリを共有できます。SQL …

3
特定のアラビア文字を同一として扱う
アラビア語には、ا(alef)やأ(hamza付きのalef)などの文字があります。 ユーザーはそれらを交換可能に書き込み、それらを交換可能に検索したいと考えています。SQL Serverはそれらを個別の文字として扱います。SQLでそれらを同じ文字として扱うにはどうすればよいですか? 挿入時にأ(hamzaを含むアレフ)をا(alef)に置き換えると考えましたが、アラビア語にはا(alef)やأ(hamefを含むアレフ)以外にも多くの選択肢があります。 私が試したArabic_CI_ASし、Arabic_CI_AIそれは問題を解決していません。 問題を再生成するスクリプトは次のとおりです。 CREATE TABLE [dbo].[TestTable] ( [ArabicChars] [nvarchar](50) NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED ( [ArabicChars] ASC ) ) ON [PRIMARY]; INSERT INTO TestTable values (N'احمد'); INSERT INTO TestTable values (N'أحمد'); SELECT * FROM TestTable WHERE ArabicChars like N'ا%'; 結果は次のとおりです。 ArabicChars احمد (1 row(s) affected) …

3
一般に、データベースの行のすべての変更の記録はどのように保存されますか?
私が取り組んでいるプロジェクトでは、さらに監査またはロールバックするために、データベースの一部のテーブルの行に対するすべての変更を追跡する必要があります。その行を誰がどのIPアドレスからいつ変更したかを簡単に見つけ、以前のバージョンを復元できる必要があります。 同様のものが、たとえばStack Exchangeでも使用されています。他の人の質問を変更すると、自分が変更したことがわかり、変更をロールバックできます。 現在のスキーマが平均的なビジネスアプリとほとんど同じプロパティ(以下)を持っている場合、オブジェクトのすべての変更をデータベースに格納するために使用される一般的な手法は何ですか? オブジェクトのサイズは比較的小さいです。nvarchar(1000)たとえば、バイナリデータの巨大なblobはなくても、ディスクに直接保存され、Microsoft SQL ではなく直接アクセスされる場合がありますfilestream。 データベースの負荷はかなり低く、データベース全体はサーバー上の1つの仮想マシンによって処理されます。 以前のバージョンへのアクセスは、最新バージョンへのアクセスほど高速である必要はありませんが、それでも最新の状態¹であり、遅すぎない必要があります²。 <tl-dr> 次のようなケースを考えましたが、そういうシナリオはあまり経験がないので、他の人の意見を聞いてみました。 IDとバージョンで行を区別して、すべてを同じテーブルに格納します。IMO、それは深刻な愚かであり、パフォーマンスレベルで遅かれ早かれ傷つけるでしょう。このアプローチでは、最新のアイテムとバージョントレースに異なるセキュリティレベルを設定することも不可能です。最後に、すべてのクエリを記述するのはより複雑になります。実際、最新のデータにアクセスするには、IDですべてをグループ化し、各グループで最後のバージョンを取得する必要があります。 1つのテーブルに最新バージョンを保存し、変更のたびに、古いバージョンを別のスキーマの別のテーブルにコピーします。欠点は、変更されていなくても、常にすべての値を保存することです。変更された値をに設定することnullは解決策ではありません。値がに、nullまたはに変更されたときにも追跡する必要があるためnullです。 最新バージョンを1つのテーブルに保存し、変更されたプロパティのリストと以前の値を別のテーブルに保存します。これは、二つの傷のようだ:最も重要なのは同じ列に以前の値の異質なタイプをソートする唯一の方法は持っているということですbinary(max)。2つ目は、以前のバージョンをユーザーに表示するときに、このような構造を使用するのがより困難になると私は考えています。 前の2つのポイントと同じことを行いますが、バージョンを別のデータベースに保存します。パフォーマンスに関しては、同じデータベースに以前のバージョンを置くことで最新バージョンへのアクセスが遅くなるのを避けるために興味深いかもしれません。それでも、これは時期尚早の最適化であり、同じデータベースに古いバージョンと最新のバージョンを置くことがボトルネックであるという証拠がある場合にのみ実行する必要があると思います。 </ tl-dr> ¹たとえば、HTTPログの場合と同様に、ログファイルに変更を保存し、サーバーの負荷が最も低い夜間にログからデータベースにデータをフラッシュすることはできません。異なるバージョンに関する情報は、すぐに、またはほぼすぐに入手できる必要があります。数秒の遅延は許容範囲です。 ²情報へのアクセスはそれほど頻繁ではなく、特定のユーザーグループのみがアクセスしますが、バージョンのリストが表示されるまで30秒間待つように強制することはできません。この場合も、数秒の遅延は許容されます。

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