Toad for Oracle, Mysql, Sql server

Το καλύτερο εργαλείο για την διαχείριση των βάσεων. Πλέον κάτω από την ομπρέλα της Dell.

Ανοίξτε λογαριασμό στο site υποστήριξης της ORACLE(MOS-Metalink).

Η Oracle προσφέρει support και χρήσιμες πληροφορίες σε προβλήματα και bugs μέσω του συγκεκριμένου site.

Μπορείτε από το eDelivery της Oracle να κατεβάσετε Μysql και Oracle λογισμικό

Mysql μια open source βάση με support πλέον επι πληρωμή, από την Oracle.

Το support της microsoft για όλα τα προιόντα της

Χρήσιμες πληροφορίες-guides που αφορούν τόσο προβλήματα όσο και τρόπους εγκατάστασης του database λογισμικού.

Oracle Documentation

Εδώ υπάρχει το επίσημο documentation της Oracle.

Εμφάνιση αναρτήσεων με ετικέτα scripts. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα scripts. Εμφάνιση όλων των αναρτήσεων

Τετάρτη 1 Φεβρουαρίου 2017

Backup όλων των αντικειμένων μιάς βάσης ενός Microsoft Sql Server (ddl)

Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί ένας χρήστης να κάνει export το schema μιας βάσης ενός microsoft sql server με την βοήθεια powershell scripting. Πολλές φορές θέλουμε να παίρνουμε το schema μιας βάσης για λόγους versioning και θα θέλαμε αυτό να γίνεται τακτικά και αυτόματα με καποίο job ή script. Λοιπόν αυτό μπορεί να φαίνεται και να είναι εύκολο για μια βάση Oracle (χρήση export εργαλείου) αλλά για έναν Microsoft Sql Server τα πράγματα δεν είναι τόσο απλά.

Για να μπορέσει κάποιος να φτιάξει μια αυτόματη διαδιακασία που θα κάνει export το schema της βάσης καθημερινά θα πρέπει εν ολίγης να κάνει reverse engineering στο εργαλείο που χρησιμοποιεί το management studio. Έφαγα πολλές ανθρωποώρες για να καταλήξω στην δημιουργία κατάλληλου powershell script που να μπορεί να κάνει χρήση του Microsoft smo scripter και να παράγει σε διάφορα αρχεία .sql το σχήμα της βάσης. Για να είμαι σίγουρος ότι προχωράω σωστά χρησιμοποίησα ένα πολύ χρήσιμο εργαλείο που σύγκρινε το σχήμα του script με το σχήμα της βάσης από όπου το πήρα (το σχήμα που εβγαλά το έριχνα σε μια τεστ βάση για να κάνω την σύγκριση). Το εργαλείο είναι το SQL Examiner  και εικόνα του ακολουθεί.


Τελικά μετά απο πολύ δουλεία και ψάξιμο κατέληξα στο παρακάτω Powershell script το οποίο το κοινοποιώ σε όποιο θέλει να κάνει κάτι αντίστοιχο. Ελπίζω να σώσω πολλές ανθρωποώρες δουλειάς απο κάποιον και να σας φανεί χρήσιμο. Χρήσιμες συμβουλές είναι ότι αν θέλει καποιός να φέρει σε ένα DR περιβάλλον όλη την βάση θα πρέπει να τρέξει τα scripts με την εξής σειρά:
1. users, 2. Roles, 3. Schemas, 4. Database Triggers, 5. User Defined Data Types, 6. Defaults, 7. Tables, 8. Tables Trigger, 9. Functions, 10. Views, 11. Store Procedures, 12. Rules, 13. Synonyms, 14. Xml Schema, 15. CLR assemblies.

Παρακάτω ακολουθεί το powershell script που κάνει export ολο το schema. To Script αυτό μπορεί να τρέχει σε  έτσι όπωσ φαίνεται στην πρώτη γραμμή και να οριστεί ένα schedule task που να το καλεί όταν κάποιος θέλει αν το καλέσει:

# Usage:  powershell ExportSchema.ps1 "SERVERNAME" "DATABASE" "C:\<YourOutputPath>"


# Start Script
Set-ExecutionPolicy RemoteSigned

# Set-ExecutionPolicy -ExecutionPolicy:Unrestricted -Scope:LocalMachine
function GenerateDBScript([string]$serverName, [string]$dbname, [string]$scriptpath)
{
  [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
  [System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
  $srv = new-object "Microsoft.SqlServer.Management.SMO.Server" $serverName
  $srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View], "IsSystemObject")
  $db = New-Object "Microsoft.SqlServer.Management.SMO.Database"
  $db = $srv.Databases[$dbname]
  $scr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
  $deptype = New-Object "Microsoft.SqlServer.Management.Smo.DependencyType"
  $scr.Server = $srv
  $options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"
  $options.AllowSystemObjects = $true
  $options.IncludeDatabaseContext = $true
  $options.IncludeIfNotExists = $true
  $options.ClusteredIndexes = $true
  $options.Default = $true
  $options.DriAll = $true
  $options.Indexes = $true
  $options.Triggers = $true
  $options.NonClusteredIndexes = $true
  $options.IncludeHeaders = $false
  $options.ToFileOnly = $true
  $options.AppendToFile = $true
  $options.ScriptDrops = $false
  $options.Permissions = $true
  $options.WithDependencies = $true
  $options.ExtendedProperties =$true
  #$options.Logins=$true
  #$scr."Object-Level Permissions" = $true
  #$scr.Owner = $true
  $db_role = New-Object "Microsoft.SqlServer.Management.SMO.DatabaseRole"
  $db2 = $srv.Databases.Item($dbname)


  # Set options for SMO.Scripter
  $scr.Options = $options
  
  
  #pairnw tin hmeromhnia kai thn vazw sto arxeio
  $a = Get-Date
  $day=$a.Day
  $month=$a.Month
  $year=$a.Year


 #=============
 # ASSEMBLY
 #=============
  $DBAssemblies  = $db.assemblies # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_assemblies.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_assembly in $DBAssemblies )
  {
    $DBAssemblies | foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }






  #=============
 # Synonyms
 #=============
  $DBSynonyms  = $db.Synonyms # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_rules.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_synonym in $DBSynonyms )
  {
    $DBSynonyms | foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }



 #=============
  # Table Triggers
  #=============
  $options.FileName = $scriptpath + "\$($dbname)_table_triggers.sql"
  New-Item $options.FileName -type file -force | Out-Null
  Foreach ($tb in $db.Tables)
  {     
    if($tb.triggers -ne $null)
    {
      foreach ($trigger in $tb.triggers)
      {
     $tb.triggers| foreach {$_.Script()+ "GO"} | Out-File -Append $($options.FileName) 
        #$scr.Script($trigger)
      }
    }
  } 


 #=============
 # Users
 #=============
  $DBUsers = $db.Users # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_users.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_users in $DBUsers)
  {
    $DBUsers | foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }


  #=============
 # Rules
 #=============
  $DBRules  = $db.Rules # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_rules.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_rule in $DBRules )
  {
    $DBRules  | foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }





 #=============
 # DEfaults
 #=============
  $DBDefaults = $db.Defaults # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_defaults.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_default in $DBDefaults)
  {
    $DBDefaults | foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }


 #=============
 # UserDefinedDataType
 #=============
  $DBtypes = $db.UserDefinedDataTypes # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_types.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_type in $DBtypes)
  {
    $DBtypes| foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }




 #=============
 # DB Schemas
 #=============
  $DBSchemas = $db.schemas # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_schemas.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_schemas in $DBSchemas)
  {
    $DBSchemas| foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }

 #=============
 # DB Roles
 #=============
  $DBRoles = $db.Roles # where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_roles.sql"
  New-Item $options.FileName -type file -force | Out-Null
  
  Foreach ($db_role in $DBRoles)
  {
    $DBRoles| foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
   
  }
  
  
  #=============
  # Tables
  #=============
  $options.FileName = $scriptpath + "\$($dbname)_tables.sql"
  New-Item $options.FileName -type file -force | Out-Null
  Foreach ($tb in $db.Tables)
  {
   If ($tb.IsSystemObject -eq $FALSE)
   {
    $smoObjects = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection
    $smoObjects.Add($tb.Urn)
    $scr.Script($smoObjects)
   }
  }
  

  

  #=============
  # Views
  #=============
  $options.FileName = $scriptpath + "\$($dbname)_views.sql"
  New-Item $options.FileName -type file -force | Out-Null
  $views = $db.Views | where {$_.IsSystemObject -eq $false}
  Foreach ($view in $views)
  {
    if ($views -ne $null)
    {
     $scr.Script($view)
   }
  }
  
   

  #=============
  # StoredProcedures
  #=============
  $StoredProcedures = $db.StoredProcedures | where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_stored_procs.sql"
  New-Item $options.FileName -type file -force | Out-Null
  Foreach ($StoredProcedure in $StoredProcedures)
  {
    if ($StoredProcedures -ne $null)
    {   
     $scr.Script($StoredProcedure)
   }
  } 

  #=============
  # Functions
  #=============
  $UserDefinedFunctions = $db.UserDefinedFunctions | where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_functions.sql"
  New-Item $options.FileName -type file -force | Out-Null
  Foreach ($function in $UserDefinedFunctions)
  {
    if ($UserDefinedFunctions -ne $null)
    {
     $scr.Script($function)
   }
  } 

  #=============
  # DBTriggers
  #=============
  $DBTriggers = $db.Triggers #| where {$_.IsSystemObject -eq $false}
  $options.FileName = $scriptpath + "\$($dbname)_db_triggers.sql"
  New-Item $options.FileName -type file -force | Out-Null
  foreach ($trigger in $DBTriggers)
  {
    if ($DBTriggers -ne $null)
    {
      #$scr.Script($DBTriggers)
 $DBTriggers| foreach {$_.Script()+ "GO"} | Out-File $($options.FileName) 
    }
  }


}

#=============
# Execute
#=============
$scrap = "-+- Exporting by exportschema.ps1 for " + $args[0] + " " + $args[0] + " " + $args[1] + " " + $args[2]
Write-Output $scrap
GenerateDBScript $args[0] $args[1] $args[2]












Πέμπτη 4 Αυγούστου 2016

ASM διαχείριση χώρου – Εργαλεία, χρήσιμα queries


Στο άρθρο αυτό θα μιλήσουμε για την διαχείριση χώρου μέσω ASM.Η oracle δίνει την δυνατότητα στους χρήστες της να μην ασχολούνται με την διαχείριση του χώρου που καταλαμβάνει η βάση στο δίσκο, αλλά να κάνει την διαχείριση η oracle μόνη της με την χρήση του automatic storage management. Το εργαλείο αυτό απαιτεί προχωρημένες γνώσεις, για αυτό θα προσπαθήσω να κάνω μια απλή αναφορά στα πιο κρίσιμα ζητήματα που προκύπτουν από την χρήση του.

Η διαχείριση και παραμετροποίηση του ASM γίνεται μέσω του asmtoolg tool. Εκτενής αναφορά στο ASM δεν γίνεται στο συγκεκριμένο ebook, απλά στην συνέχεια παρατίθενται κάποια χρήσιμα queries.

Τα 3 queries που ακολουθούν δίνουν πληροφορίες σχετικά με τους δίσκους που έχουν δοθεί στο ASM να διαχειριστεί.

SQL> select * from v$asm_diskgroup;
SQL> select * from v$asm_file;
SQL>select name,group_number,disk_number,mount_status,state,path
from v$asm_disk
order by group_number;


Η επόμενη εντολή δίνει την δυνατότητα να δει κάποιος πως προστίθεται datafile σε ASM περιβάλλον.

SQL>alter tablespace trs_trans_data_2009 add datafile
'+oradata/orcl/oradata2/dbfiles/prtrs/trs_trans_data_2009.dbf' size 500m
autoextend on next 50m maxsize 20000m;



Δημιουργία Private Database link σε χρήστη από τον διαχειριστή της βάσης



Στο άρθρο αυτό θα μιλήσουμε για το πως η εκτέλεση της παρακάτω εντολής δημιουργεί ένα database link για την επικοινωνία της βάσης με μία άλλη βάση. Το link αυτό μπορεί να χρησιμοποιηθεί μόνο από συγκεκριμένο χρήστη.To query πρέπει να τρέξει με ισχυρά δικαιώματα (DBA privileges)

SQL> declare
uid number;
sqltext varchar2(10000) := 'CREATE DATABASE LINK
"DEVWWW1MYSQLCRM1.HELEX.GR" CONNECT TO "crm1" IDENTIFIED BY
"password" USING ''mysql2''';
myint integer;
begin
select user_id into uid from all_users where username like 'PORTAL_VIEWER';
myint:=sys.dbms_sys_sql.open_cursor();
sys.dbms_sys_sql.parse_as_user(myint,sqltext,dbms_sql.native,UID);
sys.dbms_sys_sql.close_cursor(myint);
end ;



Διαγραφή Oracle Service από Windows σύστημα


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να διαγράψουμε ένα oracle service από ένα Windows συστημα. Η εκτέλεση της παρακάτω εντολής σβήνει το oracle service ολοκληρωτικά από ένα windows σύστημα (το σβήνει και από την registry).

CMD>sc delete Service_nameOracleOraDb11g_homER_NSROM;


Κρυφές παράμετροι βάσης


Στο άρθρο αυτό θα μιλήσουμε για το query που εμφανίζει τις τιμές των κρυφών παραμέτρων μιας oracle βάσης.

SQL> select a.ksppinm name,b.ksppstvl value,b.ksppstdf deflt,
decode
(a.ksppity, 1,'boolean', 2,'string', 3,'number', 4,'file', a.ksppity) type,
a.ksppdesc description
from sys.x$ksppi a,sys.x$ksppcv b
where a.indx = b.indx and a.ksppinm like '\_%' escape '\'
order by name;



Concatenation μέσω sql εντολών


Στο άρθρο αυτό θα μιλήσουμε για  ένα oracle query που δίνει τον  τρόπος να κάνουμε concatenation με την χρήση του συμβόλου ||.


SQL>select 'SSP.' || TABLE_NAME from sys.all_tables where OWNER='SSP' and TABLE_NAME LIKE 'BAL_%'


Default τιμές για τα προφίλ ασφαλείας των χρηστών


Στο άρθρο αυτό θα μιλήσουμε για τον τρόπο που μπορεί κάποιος να  δει τις default τιμές που έχουν οριστεί σε μια βάση δεδομένων oracle. Στο query που ακολουθεί εμφανίζονται όλες οι default τιμές των profile ασφαλείας των χρηστών της βάσης .Το query το τρέχουμε με dba privileges.

SQL>select * from sys.dba_profiles;


Grant σε views ισχυρών λογαριασμών sys, system


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να  δώσουμε την δυνατότητα σε ένα χρήστη να δει τα περιεχόμενα συστεμικών πινάκων. Όταν επιθυμούμε να δώσουμε την δυνατότητα σε ένα χρήστη της βάσης να κάνει select από ένα συστεμικό view πχ v$session θα πρέπει να γίνει Grant το privilege στο πχ v_$session.

SQL>grant select on v_$session to hr;




MAIL - Ρύθμιση της βάσης ώστε να μπορεί να στείλει email (utl_mail)



Στο άρθρο αυτό θα μιλήσουμε για το πωσ μπορεί μια βάση δεδομένων oracle να ρυθμιστεί σωστά ώστε να μπορεί να στείλει email. Για να μπορέσει μια βάση να στείλει email θα πρέπει να εγκαταστήσουμε το πακέτο UTL_MAIL και να ορίσουμε κατάλληλα την παράμετρο SMTP_OUT_SERVER. Για να εγκαταστήσουμε το UTL_MAIL πρέπει να τρέξουμε με έναν ισχυρό λογαριασμό τα παρακάτω μέσω sqlplus.

SQL>sqlplus sys/<pwd>
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb


Στην συνέχεια θα πρέπει να ορίσουμε την παράμετρο SMTP_OUT_SERVER στο παραμετρικό αρχείο εκκίνησης της βάσης (pfile). Για να το κάνουμε αυτό εκτελούμε την παρακάτω εντολή.

SQL> alter system set smtp_out_server = 'mail.helex.gr:25' scope=both;
(Δυναμική παράμετρος – Αλλάζει χωρίς να χρειαστεί να κατέβει η βάση)

Δίνουμε το δικαίωμα να εκτελεί το συγκεκριμένο πακέτο είτε ο χρήστης PUBLIC οπότε όλοι οι χρήστες της βάσης, είτε συγκεκριμένοι χρήστες που θέλουμε. Οι παρακάτω εντολές εκτελούνται από χρήστη με ισχυρά δικαιώματα στην βάση (DBA δικαιώματα).

SQL> grant execute on utl_mail to public;
SQL> grant execute on utl_mail to <user>;


Τέλος, θα πρέπει να δημιουργηθεί ένα ACL για τον email server και να επιδοθούν τα απαραίτητα δικαιώματα στους χρήστες που θέλουμε να μπορούν να στείλουν email. Χωρίς την δημιουργία ACL θα εμφανίζεται το παρακάτω error: “ORA-24247: network access denied by access control list (ACL)“.

SQL> BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => 'utl_mail.xml',
description => 'Permissions to access e-mail server.',
principal => 'SCHEMA_NAME',
is_grant => TRUE,
privilege => 'connect');
COMMIT;
END;


DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl => 'utl_mail.xml',
host => 'mailrelay.helex.gr',
lower_port => 25,
upper_port => 25);
COMMIT;
END;



Δημιουργία/Διαχείριση ACL (Access Control List)


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε και να διαχειριστούμε Access Control Lists. Από την έκδοση 11g και μετά για να υπάρχει η δυνατότητα η βάση να επικοινωνεί απευθείας είτε με email server για να στέλνει email, είτε με εξωτερικά sites για να στέλνει και να παίρνει διάφορες πληροφορίες, δημιουργήθηκε μια λίστα πρόσβασης κάτι σαν εσωτερικό firewall. Αν λοιπόν θέλουμε η βάση μας να αποκτήσει επικοινωνία με εξωτερικά sites ή servers απευθείας θα πρέπει να γίνει η κατάλληλη καταχώρηση στην συγκεκριμένη λίστα. Περισσότερες πληροφορίες σχετικά με το πώς κάποιος δημιουργεί και διαχειρίζεται τέτοιου είδους λίστες μπορεί να δει στο ακόλουθο Link.

http://www.morganslibrary.org/reference/pkgs/dbms_network_acl_admin.html

Στην συνέχεια ακολουθούν οι κατάλληλες εντολές δημιουργία μιας τέτοιας λίστας μαζί με την εντολή εκχώρησης δυνατότητας σύνδεσης στον server link2.athexnet.gr.


SQL>begin
dbms_network_acl_admin.create_acl (
acl => 'utl_mail.xml',
description => 'Allow mail to be send',
principal => 'DB_USER',
is_grant => TRUE,
privilege => 'connect'
);
commit;
end;


SQL>begin
dbms_network_acl_admin.assign_acl(
acl => 'utl_mail.xml',
host => 'link2.athexnet.gr'
);
commit;
end;


Τέλος υπάρχουν τα παρακάτω 4 queries που μας δίνουν την δυνατότητα να δούμε χρήσιμες πληροφορίες σχετικά με τις access control lists της βάσεως και να κάνουμε χρήσιμες ενέργειες που αφορούν τα acls.

Με το παρακάτω query βλέπουμε όλα τα acls που έχουν δημιουργηθεί στην βάση.

SQL>select * from dba_network_acls
Με το ακόλουθο query βλέπουμε σε ποιους χρήστες της βάσης έχει δοθεί πρόσβαση και σε ποια acls.

SQL>select acl,principal,privilege,is_grant from dba_network_acl_privileges;

Έλεγχος αν συγκεκριμένο acl δουλεύει σωστά και επιτρέπει την πρόσβαση εκεί που θέλουμε.

SQL>select dbms_network_acl_admin.check_privilege_aclid (
'9f9b59d32d942527e04016ac15c74bbd', 'cypowner', 'connect')
from dual;


Με την παρακάτω εντολή δίνουμε το δικαίωμα σε κάποιον χρήστη να έχει πρόσβαση σε συγκεκριμένο ACL.

SQL>exec dbms_network_acl_admin.add_privilege(acl => 'utl_ftp_iplink2.xml',
principal => 'DERIVPROD', is_grant => TRUE, privilege => 'connect');




Δημιουργία προφίλ ασφαλείας χρηστών (security profile)


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε ένα προφιλ ασφαλείας σε μία βάση δεδομένων Oracle. Πολλές φορές θέλουμε οι χρήστες της βάσης να έχουν συγκεκριμένα δικαιώματα ασφαλείας. Δικαιώματα που εκχωρούνται σε αυτούς μέσω κατάλληλων προφίλ ασφαλείας. Τα προφίλ αυτά δημιουργούνται και στην συνέχεια εκχωρούνται στους αντίστοιχους χρήστες. Η παρακάτω εντολή είναι ένα χαρακτηριστικό παράδειγμα δημιουργίας προφίλ ασφαλείας. 

SQL>create profile "default" limit
sessions_per_user unlimited
cpu_per_session unlimited
cpu_per_call unlimited
connect_time unlimited
idle_time unlimited
logical_reads_per_session unlimited
logical_reads_per_call unlimited
composite_limit unlimited
private_sga unlimited
failed_login_attempts unlimited
password_life_time unlimited
password_reuse_time unlimited
password_reuse_max unlimited
password_lock_time unlimited
password_grace_time unlimited
password_verify_function null;


Γενικότερα το προφίλ ορίζει παραμέτρους που αφορούν το password του χρήστη καθώς και τα resources της βάσης που θα μπορεί να χρησιμοποιήσει.

Μεταφορά πινάκων και Indexes από ένα tablespace σε ένα άλλο


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί κάποιος να μεταφέρει πίνακες και indexes από ένα Tablespace σε ένα άλλο σε μια βάση δεδομένων Oracle.Τρέχουμε τις παρακάτω εντολές για να δημιουργήσουμε τα scripts που θα τρέξουμε στην συνέχεια ώστε να γίνει η μεταφορά όλων των αντικειμένων του χρήστη σε νέο tablespace. Αν θέλουμε να μεταφέρουμε συγκεκριμένα αντικείμενα του χρήστη επιλέγουμε τα αντικείμενα που θέλουμε να μεταφέρουμε. Τρέχουμε τα scripts που έχουν προκύψει. 

SQL>select 'alter table ' || user_tables.table_name || ' move tablespace ' || 'M_DATA;' 
 from user_table;

SQL>select 'alter index ' || user_tables.table_name || ' rebuild tablespace ' || 'M_DATA;' 
 from user_tables;



Τετάρτη 3 Αυγούστου 2016

Trace file - tkprof


Στο άρθρο αυτό θα μιλήσουμε επιγραμματικά για το πολύ χρήσιμο εργαλείο της oracle tkprof. Όταν εμφανίζεται ένα πρόβλημα στην βάση συχνά παράγεται και ένα trace file σχετιζόμενο με το error. Πολλές φορές το oracle support ζητάει να αποσταλεί το trace file αφού πρώτα γίνει ανάλυση του με το εργαλείο tkprof. Για να τρέξουμε την συγκεκριμένη εντολή πρέπει να την τρέξουμε από το φάκελο μέσα στον οποίο έχουν εγκατασταθεί τα εκτελέσιμα της oracle. Η εντολή συντάσσεται όπως φαίνεται στην συνέχεια


CMD>tkprof filename1 filename2

όπου filename1=το trace file προς ανάλυση και filename2=το outpout του tkprof εργαλείου.

Τετάρτη 16 Μαρτίου 2016

Oracle Temporary Tablespace - Σβήσιμο και ξανά δημιουργία


Στο άρθρο αυτό θα μιλήσουμε για το temporary tablespace μιας βάσης δεδομένων oracle. Δημιουργούμε ένα καινούργιο TEMP1 (default temporary tablespace). Σβήνουμε το παλιό (TEMP), το ξαναδημιουργούμε πιο μικρό και το κάνουμε default temporary για την βάση. Τέλος σβήνουμε το παλιό TEMP1. Έτσι καταλήγουμε με ένα μικρότερο temporary tablespace με το ίδιο όνομα αλλά με πολύ μικρότερο μέγεθος.

SQL> create temporary tablespace temp1 tempfile '/u02/dbfiles/aylo/temp101_u02.dbf' size 2000m 

SQL> alter database default temporary tablespace TEMP1

SQL> drop tablespace TEMP including contents and datafiles

SQL> create temporary tablespace temp tempfile '/u02/dbfiles/aylo/temp.dbf' size 2000m 

SQL> alter database default temporary tablespace TEMP

SQL> drop tablespace TEMP1 including contents and datafiles


Σε περίπτωση που σκάει η εντολή σβησίματος του TEMP tablespace, τρέχουμε το παρακάτω query και με βάση τα αποτελέσματα σκοτώνουμε το session-s που δημιουργούν το πρόβλημα και προχωράμε στην οριστική διαγραφή.

SQL> select se.username username,se.SID sid, se.serial# serial#, se.status status, se.sql_hash_value, se.prev_hash_value,se.machine machine, su.TABLESPACE 
tablespace,su.segtype,su.CONTENTS CONTENTS
from v$session se, v$sort_usage su
where se.saddr=su.session_addr;

SQL> alter system kill session 'sid,serial'; (πχ ‘23,342’ )

Τετάρτη 9 Μαρτίου 2016

Oracle Database - Δημιουργία/Διαγραφή πίνακα


Στο άρθρο αυτό θα μιλήσουμε για την δημιουργία πίνακα δεδομένων σε μια βάση Oracle. Ακολουθεί ένα ενδεικτικό παράδειγμα και η ανάλυσή του. 

SQL> create table όνομα χρήστη.όνομα πίνακα (
           stocks_code number(10),
           companies_code number(10),
           ashscode char(25 byte),
           en_abbreviation varchar2(40 byte),
           listing_date date,
           share_type varchar2(4 byte),
           adts number(25,2),
           a number(5,2),
          smss number(10,2),
          )
          tablespace mm_data
          result_cache (mode default)
          pctused 0
          pctfree 10
          initrans 1
         maxtrans 255
         storage (
            initial 40k
            next 1m
            minextents 1
            maxextents unlimited
           pctincrease 0
           buffer_pool default
           flash_cache default
          cell_flash_cache default
            )
         logging
         nocompress
         nocache
         noparallel
         monitoring;

Όταν θέλουμε να δημιουργήσουμε ένα πίνακα θα πρέπει πρώτα να ορίζουμε το όνομα του πίνακα μαζί με το σχήμα στο οποίο θα ανήκει (full name – σχήμα.όνομα πίνακα). Στην συνέχεια ορίζουμε τα πεδία του πίνακα και τι τύπου θα είναι ανάλογα με το τι θα αποθηκεύσουμε μέσα (αριθμό, αλφαριθμητικό, ημερομηνία). Αφού γίνει αυτό ορίζουμε το tablespace στο οποίο θα αποθηκεύεται ο πίνακας και άλλα χαρακτηριστικά που αφορούν αν θα γίνεται log, αν θα είναι compress κτλ.


SQL>drop table nikos.mm_bf_day_stats cascade constraints purge;

Για να σβήσουμε ένα πίνακα τρέχουμε την παραπάνω εντολή είτε προσθέτοντας την επιλογή cascade constraints (σβήνει όλα τα referential contraints) είτε την επιλογή purge (συμπιέζει και αποδεσμεύει το χώρο που καταλάμβανε ο πίνακας).


Παρασκευή 4 Μαρτίου 2016

Oracle Tablespaces - Χρήσιμα scripts


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε oracle tablespaces (λογικός χώρος όπου θα αποθηκεύοντε τα δεδομένα μας) και πως μπορούμε να τα διαχειριστούμε και να τα τροποποιήσουμε κατάλληλα. 

Δημιουργία Oracle Tablespace

             SQL> create tablespace BO_REP_DATA datafile
                       '/oradata/dbfiles/SSP/bo_rep_data.dbf'
                       size 50M
                       autoextend on next 50M
                       maxsize 30000M
                       logging
                       online
                       extent management local autoallocate
                       blocksize 8K
                       segment space management auto
                       flashback on;


Το μονοπάτι στο δίσκο όπου θα αποθηκεύονται τα δεδομένα πρέπει να οριστεί για linux (/oradata/dbfiles/SSP/bo_rep_data.dbf) ή για windows (H:\ORADATA\DBFILES\MPWDB\HERDS_APEX.DBF) λειτουργικό αναλόγως.

Προσθήκη Datafile σε Tablespace

         SQL> alter tablespace USERS add datafile                                                                                '/oradata2/dbfiles/PRTRS/TRS_TRANS_DATA_2009.dbf'
                    size 500M
                    autoextend on
                    next 50M
                    maxsize 20000M


Προσθήκη καινούργιου datafile στο tablespace USERS μεγέθους 500ΜΒ το οποίο γίνεται autoextend όταν φτάσει στο όριό του αυτόματα κατά 50 ΜΒ κάθε φορά και μπορεί να φτάσει μέχρι τα 20GB.

Αλλαγή θέσης Datafile στο file system

         SQL> alter database rename file 
                  '/oradata/dbfiles/PRTRS/trs_trans_data_2007.dbf' to                                                   '/oradata2/dbfiles/PRTRS/trs_trans_data_2007.dbf'

Βάζουμε την βάση σε mount state (περιγράφετε στο 2.1) και εκτελούμε την παρακάτω εντολή με κάποιον χρήστη που να έχει δικαίωμα να το κάνει (DBA privileges)

Αφαίρεση δυνατότητας εγγραφής στοιχείων από χρήστη σε tablespace

        SQL> revoke resourse role;
                 (για να μην μπορεί να γράψει σε όλα τα tablespaces εκτός από τα defaults)
       SQL> alter user DERIVPROD quota 0M on system;
                (για να μην μπορεί να γράψει στο συγκεκριμένο tablespace)